Ruby関連のことを調べてみた2021年11月01日

Ruby関連のことを調べてみた2021年11月01日
目次

[Rails]has_oneやbelongs_toをリロード!削除されたときの挙動がreload_associationとreloadで違うので注意!

ActiveRecordのアソシエーションは1度取得するとキャッシュしてくれるため、2度目からはSQLが発行されません。
この機能はとても便利なのですが、たまに最新の情報にリロードしたいときがあります。

例えば下記のようにuser.profile.addressが別で更新された場合です。

“`irb
irb(main):001:0> user = User.first

# profileは初回アクセスなので、SQLが発行される
irb(main):003:0> user.profile.address
Profile Load (0.9ms) SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`user_id` = 2 LIMIT 1
=> “住所だよ”

# profileはキャッシュしているのでSQLは発行されない
irb(main):004:0> user.profile.address
=> “住所だよ”

# 別プロセスでprofile.addressを更新
irb(main):005:0> Profile

元記事を表示

【Ruby silver】三項演算子が入れ子になっていて難しかった話(三項演算子、論理演算子、和集合、積集合を使ったコード)

#以下のコード実行後の正しい表示結果を選べ。
“`
a = [1, 2, 3, 5, 8]
b = [1, 3, 6, 7, 8]
c = false || true ? true && false ? a | b : a & b : b ;
p c
“`
#解
“`
=>[1, 3, 8]
“`

#私の知っている三項演算子と様子が違う
頭の中にハテナが飛び散った。
つまづいた点として“「条件式A ? 条件式B ? 式C : 式D : 式E」“の構造になっていたこと。
通常のチェリー本等で見ていた三項演算子はこうだった。
“「条件式 A ? 式 B : 式 C」“
この式は2重構造になっていた。

###結論から言うとこの式はこうゆうことだった。

“`ruby
if false || true #=>true
if true && false #=>false
a | b
else
a & b
end
b
end
“`
①“if false || true“ #=>trueが返るので次のifに進む
②“if true &&

元記事を表示

Ruby on Railsのscaffoldを使ってみる

##はじめに
Ruby on Railsのscaffoldを使ってみました。
今までは勉強のために一つ一つ記述していたのですが、一度も使ってなかったのでお試しです。

###scaffoldとは
調べてみると、今まで一つ一つ記述していたモデル、コントローラー、ビュー、ルーティングを自動的に作成してくれるみたいですね。
すごく手間が省かれますね。めっちゃ便利!!

###使ってみた
まずはコマンドです。今回はモデル名は「Post」で作成します。

“`
$ rails g scaffold Post カラム名 データ型
“`

“`
            invoke active_record
create db/migrate/20211031145458_create_posts.rb
create app/models/post.rb
invoke test_unit
create test/models/post_test.rb
create test/fixtures/

元記事を表示

【422 Unprocessable Entity 】のバリデーションエラー、外部キー制約が原因でした。

コードを書いてテストを実行したら**「422 Unprocessable Entity」**というエラーが出ました。
ググってみたらバリデーションエラーみたいです。
そして、自分の場合は外部キー制約の書き方に問題がありました。

### 環境
– Ruby 2.6.3
– Ruby on Rails 6.0.1

#結果
:::note
modelの外部キー制約のチェックを任意にしてあげる。
:::

#前提
利用者(User)が車を1台持っていたり**持っていなかったりする**状況でした。

“`ruby
class User < ActiveRecord::Base has_one :car end class Car < ActiveRecord::Base belongs_to :user # ↑ここが違っていた。 end ``` この状況だとCarモデルに`user_id`がセットされていないとバリデーションエラーが発生します。 そのため、利用者が車を持っていない場合に422エラーが発生していました。 #解決 `optional: true`を追加して

元記事を表示

WEBRickでWebサーバを立ち上げて同一LAN内のパソコンからアクセスする

## 動機
フレームワーク無しでもWEBRickで簡単にWebサーバが作れるというのを読んで、面白そうだったので手元で試してみます。以下、忘れないようにするための記録です。

## WEBRickでWebサーバーを立ち上げる(まずはローカル専用)
WEBRickについて詳しいことはこちらを見つつ。

https://docs.ruby-lang.org/ja/latest/library/webrick.html

↑これを見ると、
> WEBrick は Ruby 3.0 で標準ライブラリから削除されました。Ruby 3.0 以降で WEBrick を使いたい場合は rubygems から利用してください。

とのことなので、gem installしておきます。

“`zsh
$ gem install webrick
“`

次に、適当なディレクトリを作ってファイルを作成します。

“`server.rb
require ‘webrick’
options = { BindAddress: ‘127.0.0.1’, Port: ‘10080’, DocumentRoot: ‘

元記事を表示

Selenium + ChromeDriver + Ruby によるスクレイピング環境を Docker で構築する。

# はじめに
Docker コンテナを定期実行する形で Selenium によるスクレイピングをしたいことがあったのでその時のメモ書き。

# Dockerfile
Selenium を動かすにはブラウザ(Chrome)とブラウザのドライバー(ChromeDriver)が必要なのでインストールします。

~~~Dockerfile
# 執筆時点での最新
FROM ruby:3.0.2

# Chrome をインストール
RUN wget -q -O – https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \
&& echo ‘deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main’ | tee /etc/apt/sources.list.d/google-chrome.list \
&& apt-get update -qq \
&& apt-get install -y google-chrome-stable

元記事を表示

【Ruby silver】&, &&, |, ||演算子それぞれを使ったコードについて考える

次のコードを実行するとどうなりますか

“`ruby
a = [1, 2, 5, 7, 8]
b = [1, 3, 6, 7, 9]
c = nil || a & b | a && a | b
p c
“`
演算子の優先順位とそれぞれの演算子について理解していないと解けない問題。

—-

###積集合「&」

重複している要素は取り除かれ、共通する要素を取り出す。

“`ruby
a = [1, 2, 3]
b = [1, 3, 5]
a & b #=> [1, 3]
“`

###&&演算子

&&は a と b がどちらも真のとき、最後に評価された b を出力する

“`ruby
a && b #=> [1, 3, 5]
“`

###和集合「|」

重複している要素は取り除かれ、重複している要素をまとめて出力する。

“`ruby
a = [1, 2, 3]
b = [1, 3, 5]
a | b #=> [1, 2, 3, 5]
“`

###||演算子

||は a と b がどちらかが真のとき、最初に評価された a を出力する

“`ruby

元記事を表示

putsメソッド、printメソッド、pメソッドの違い

| メソッド | 出力後の改行 | メソッド自体の戻り値 | 改行文字を含めた場合 | 配列を出力した場合 | 呼び出すメソッド |
| —- | —- | —- | —- | —- | —- |
| puts |改行を加えて出力する。|nil|改行される|配列の[]を含まず各要素ごとに改行される|to_s |
|print|改行を加えない。|nil|改行される|配列の[]を含め改行なし|to_s|
|p|改行を加えて出力する。|ただし文字列を出力するとその文字列がダブルクオートで囲まれる。|引数のオブジェクトそのものが改行されずに/nのまま表示される|配列の[]を含め改行なし|inspect|

“putsメソッド“と“printメソッド“は内部的に引数で渡されたオブジェクトに対して“to_sメソッド“を呼び出して**文字列に変換**している。

“pメソッド“は“to_sメソッド“ではなく“inspectメソッド“を呼び出す。
文字列が出力後にダブルクオート付きになっていた理由として**内部的にStringクラスのinspectメソ

元記事を表示

【RSpec】Railsチュートリアル第6版 第8章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)
– 第8章(本記事)

#事前準備
Gemfileにテストデータ作成用のFactory Botを追加

“`rb:Gemfile
group :development, :test do
gem “factory_bot_rails”
end

元記事を表示

【Ruby silver】範囲式 フリップフロップ演算子

次のコードを実行するとどうなりますか。 

“`
10.times{|d| print d == 3..d == 5 ? “T” : “F” }
“`

解説文

d == 3..d == 5の部分は条件式に範囲式を記述しています。
この式は、フリップフロップ回路のように一時的に真偽を保持するような挙動をとります。
詳細は、Rubyリファレンスに詳しい説明がありますのでそちらを参照してください。

  • https://docs.ruby-lang.org/ja/latest/class/Range.html
  • 初めて見た時に混乱しました。
    どうゆう順番で評価するか整理して考える必要があったのでまとめます。

    **⑴Rangeの復習**

    “`ruby
    # ..の場合
    a = (1..5).to_a
    => [1, 2, 3, 4, 5]

    # …の場合
    a = (1…5).to_a
    => [1, 2, 3, 4]
    “`
    ?
    ..の場合は5を含む1〜5の範囲になる。
    …の場合は4.9999…までは対象になるが5は範囲に

    元記事を表示

    Progate Ruby on Rails5 VI ~ VII 個人的ざっくりまとめ

    # emailの重複がないかチェック

    バリデーションで`uniqueness: true`を指定

    “`rb:models/user.rb
    class User < ApplicationRecord validates :email, {uniqueness: true} end ``` # マイグレーションファイルのみ作成 データベースに変更を加えるが、モデルは必要ないとき `rails g migration ファイル名`をターミナルに入力 ```terminal:ターミナル $ rails g migration add_image_name_to_users ``` # マイグレーションファイルの仕組み テーブルの変更を加えるには、マイグレーションファイルのchangeメソッドの中に処理をかく ```rb:20170427053118_add_image_name_to_users.rb class AddImageNameToUsers < ActiveRecord::Migration[5.0] def change # 変更内容 e

    元記事を表示

    【コードリーディング】Rails 1.0 ActiveRecordのソースコードを読んでみた

    #はじめに
    Railsポートフォリオ作成でActiveRecordを使っており、作成当時は正直内部処理がどうなっているのか分かっていませんでし、気にもしていませんでした笑

    そういった中、実務案件で直接SQLを書く機会があり、ActiveRecordって実際どういう風にSQLに置換して実行しているのか気になりはじめました。

    そこで、ActiveRecordのソースコードでSQLに置き換えている仕組みの部分のコードを読んで理解した部分を書き留めたいと思います。

    #今回読んだソースコード
    今回はコードの流れをシンプルに見たかったので最新のソースコードではなくRails v1.0.0のソースコードを読みました。とは言ってもコードは約1800行もあり、読むのになかなか骨が折れました笑

    その中でもController部分でよく使用するfindメソッドに絞って読んだものを記載します。
    ソースコード元は[こちら](https://github.com/rails/rails/blob/v1.0.0/activerecord/lib/active_record/base.rb#L378)

    #そ

    元記事を表示

    【Ruby】条件分岐 備忘録

    #目的
    条件分岐 備忘録

    #結論
    とりあえず3種類あった。
    if文
    unless文
    case文

    “`ruby:timesメソッド #if文
    a = 10
    b = 20
    if a > b
    puts “aはbより大きくない”
    elsif a < b puts "aはbよりも小さい" end =>aはbより大きくない
    “`

    “`ruby:timesメソッド #unless文
    a = 10
    b = 20
    unless a > b
      puts “aはbより大きくない”
    end
    =>aはbより大きくない
    “`

    “`ruby:timesメソッド #case文
    array = [ “a”, 1, nil ]
    array.each do |item|
    case item
    when String
    puts “item is a String”
    when Numeric
    puts “item is a Numeric”
    else
    puts “item is something”
    end
    end
    =>item is a String

    元記事を表示

    【RSpec】Railsチュートリアル第6版 第7章

    #はじめに
    Railsチュートリアル第6版のテストをRSpecで書き直していく。

    ###目次
    – [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
    – [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
    – [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
    – [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
    – 第7章(本記事)

    #Minitest

    ###ユーザー登録に対するテスト

    “`rb:test/integration/users_signup_test.rb
    require ‘test_helper’

    class UsersSignupTest < ActionDispatch::IntegrationTest test "invalid signup info

    元記事を表示

    【RSpec】Railsチュートリアル第6版 第6章

    #はじめに
    Railsチュートリアル第6版のテストをRSpecで書き直していく。

    ###目次
    – [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
    – [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
    – [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
    – 第6章(本記事)
    – [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

    #Minitest

    ###Userテスト

    “`rb:test/models/user_test.rb
    require ‘test_helper’

    class UserTest < ActiveSupport::TestCase def setup @user = User.new(name: "Example User", email:

    元記事を表示

    【RSpec】Railsチュートリアル第6版 第5章

    #はじめに
    Railsチュートリアル第6版のテストをRSpecで書き直していく。

    ###目次
    – [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
    – [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
    – 第5章(本記事)
    – [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
    – [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

    #事前準備
    Gemfileにsystem spec用のcapybaraを追加

    “`rb:Gemfile
    group :test do
    gem ‘capybara’
    end
    “`

    ファイル内容の変更

    “`rb:spec/support/capybara.rb
    RSpec.configure do |config|
    config.before

    元記事を表示

    【RSpec】Railsチュートリアル第6版 第4章

    #はじめに
    Railsチュートリアル第6版のテストをRSpecで書き直していく。

    ###目次
    – [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
    – 第4章(本記事)
    – [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
    – [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
    – [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

    #Minitest

    ####StaticPagesコントローラーのテスト

    “`rb:test/controllers/static_pages_controller_test.rb
    require ‘test_helper’

    class StaticPagesControllerTest < ActionDispatch::IntegrationTe

    元記事を表示

    【Ruby on Rails】アソシエーション先のデータを `create_テーブル名` メソッドで作成する。

    ### 環境
    – Ruby 2.6.3
    – Ruby on Rails 6.0.1

    #できること
    `has_one` でアソシエーションしている場合、
    アソシエーション先のデータを`create_テーブル名`メソッドで作成できる。

    #前提
    Authorモデルに対してBookモデルがhas_oneアソシエーションしています。
    一人一冊、本を書いている状況です。

    “`ruby
    # author.rb
    class Author < ActiveRecord::Base attr_accessor :name :age has_one :book end # book.rb class Book < ActiveRecord::Base attr_accessor :title belongs_to :author end ``` # 実例 ```ruby author = Author.create(name: 'John', age: 30) author.create_book(title: 'cooking book') ``` # 最後に 上記書いておい

    元記事を表示

    変数について!

    #①.同じ値を何度も使用する!

    前回まで値を使うたびに、同じ値であっても毎回記述していました!

    しかし、毎回同じ値を書くのはめんどうです!

    たとえば円の面積の計算を行うプログラムを作成する場合、毎回円周率の値を書くのは非常に大変な作業です!

    “`php
    # 半径3の円の面積
    3 * 3 * 3.14159

    # 半径10の円の面積
    10 * 10 * 3.14159

    # 半径11の円の面積
    11 * 11 * 3.14159
    “`

    もし円周率を3.14159ではなく3.14へ変更することになったら、記述をすべて書き換える必要があります!

    この問題を解決するのが変数という仕組みです!

    #②.変数

    変数とは、値を入れる箱のようなものです!

    この箱には名前をつけることができ、どんな値が入っているのかを簡単に識別できるようになります!

    この名前を変数名と言います!

    変数を利用することで、値を再利用したい場合に、変数の名前を使うだけで呼び出すことができます!

    変数の使い方について、順に説明します!

    #③.変数の宣言と定義

    変数を作ることを変数の宣言と言います!

    元記事を表示

    deviseについて

    ## はじめに
    RubyのライブラリであるGemの「devise」のまとめです。
    「device」ではなくて「devise」なので注意。

    ### deviseでできること
    「devise」は簡単に認証機能を作成することができます。
    認証機能は新規登録画面とかログイン画面とかのことで、
    ユーザー登録が必要なサイトでは必須ですよね。

    ### 導入してみる

    #### deviseのインストール
    “`ruby:Gemfile
    gem ‘devise’
    “`
    を追加して

    “`
    $ bundle install
    “`
    をターミナルに入力。

    ####初期設定
    設定ファイルをインストールするために

    “`
    $ rails g devise:install
    “`

    これでdeviseを使用する準備は完了。

    config/initializers/devise.rb
    config/locales/devise.en.yml

    の設定ファイルが作成されているはずです。

    ####テーブルの作成
    今回はモデル名は「User」で作成します。
    「devise」はユーザテーブルを自動的に作成

    元記事を表示

    OTHERカテゴリの最新記事