U_OK_2023’s blog

主に日々のプログラミング学習についてのアウトプットと備忘録

【懸念解決】Ruby及びRailsのバージョン、beforeの謎【親子関係 end 位置を間違えていた】

みなさん、おはようございます。

U_OK_2023 です。

 

転職活動のために登録したサイトの登録情報を充実させていきたいと思います。
現段階では、まだ仮登録の状態なので、そこをしっかりと詰めていきたいと思います。

・・・

ということで、登録を完了することができました。
いよいよ本日から、応募していきたいと思います。

 

ここで、
ずっと気がかりなことがあったのですが解決することができましたので、
昨日の話をまとめたいと思います。

beforeメソッドです。

以前、このような記事を書いたことがありました。

uok2023.hatenablog.com

単体テスト中、beforeメソッドのブロックが動かず、
@user インスタンスが生成されないというエラーです。
最終的に、その時は なぜ beforeブロックが動かないのかを突き止めることができず、
各テストが実行される前に、
個別でインスタンスが生成されるように対応し、幕を下ろしたのですが、、、
このまま原因が分からないままでいいのか?と。

ですので、ダメもとで上記記事でも懸念があった
Railsインストール時のバージョン違い」を確認するために、
メンターさんに確認をしてみました。

結論

バージョンに問題はありませんでした。
というのも、バージョンには「Ruby」と「Rails」の 2つ がある。ということ。

***@*** *** % ruby -v                                                                           
ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-darwin22]
***@*** *** % rails -v
Rails 7.0.8

私の懸念は、 AWS導入時に、EC2初期設定において Ruby のバージョンを 7.0.0 ではなく、3.2.0 でインストールしてしまったと思っていたことでした。

そして、インストール後でも バージョンの切り替えは可能なのか。
については、結論 可能 とのことでした。
しかし、実装の途中段階でのバージョンの変更は非常に危険であるとのことで、
よほどのことがない限り、そのまま実装を進め、やり切ることを推奨されました。

基本的にバージョンは最新のものをインストールすれば問題はないとのこと。
では、最新のバージョンはどこで知ることができるのか。

Ruby

www.ruby-lang.org

もしくは、ターミナルで rbenv install --list と
コマンドを実行することでも確認できます。
現在は、3.2.2 が最新版のようですね。

***@*** *** % rbenv install --list
3.0.6
3.1.4
3.2.2

Rails はこちら

rubyonrails.org

本題に戻りますが、
バージョンに問題はなかったとすると、
before が動かなかったのはなぜなのか。

上記記事の内容を元に私なりの仮説をお伝えしたところ
メンターさんが最後にヒントを教えてくれました。

「親子関係を見てみてください」と。

はっ!?としました。

急ぎ、確認すると、おっしゃる通りでした。

親子関係

ここでいう親子関係とはネスト(入れ子構造)ですね。
細かい記述は割愛しますが、確認してみると以下のようになっていました。

RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end
end ←ここが根幹でした
  
  describe 'ユーザー新規登録' do
    context '新規登録できる場合' do
      it '***が存在すれば登録できる' do
        ***
      end
    end
    
    context '新規登録できない場合' do
      it '***が空では登録できない' do
        ***
      end
    end
  end

この記述では、beforeメソッドで @userインスタンスを生成しても、
describeメソッド内で @userインスタンスが使えない状態になっています。

正しくは以下のようにしなくてはいけませんね。

RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end
  
  describe 'ユーザー新規登録' do
    context '新規登録できる場合' do
      it '***が存在すれば登録できる' do
        ***
      end
    end
    
    context '新規登録できない場合' do
      it '***が空では登録できない' do
        ***
      end
    end
  end
end ←ここに移動させました

修正後、再度、テストを実行すると、
無事に単体テストをクリアすることができました。

結果論にはなりますが、懸念をそのままにしなくて良かったと思いました。

懸念は解決し、
beforeメソッドの謎も解明することができたくさん学びがありました。

基本に忠実に実装をしていこうと思います。

メンターさん、ありがとうございました。