LoginSignup
0
0

More than 3 years have passed since last update.

respond_to(respond_with)とインスタンス変数の記述順に関する注意

Posted at

問題

業務中に開発チームメイトが、コントローラで定義したviewにインスタンス変数を渡せないという問題にはまったため、その解決法を備忘録的に残しておく。

やりたいこと

同じviewファイルを使っている2つactionにおいて、あるactionによって呼ばれた時だけ表示させたい項目があり、urlの値によって条件分岐させたい(editの際は表示させて、newの時は表示させたくない)。

sample.html.slim
   ...中略...

  - if @url.include?("edit")
      f.input :hoge
sample_controller.rb
   ...中略...

  def new
     @sample = Sample.find(params[:id])
     respond_with(@sample)
     @url = request.url
  end

  def edit
     @sample = Sample.find(params[:id])
     respond_with(@sample)
     @url = request.url
  end

すると、「nilクラスにinclude?メソッド使えないよ~」的なエラー分が出ていた(はず)。
コントローラで@url定義しているのに(byebugでコントローラ上では@urlに値は入っていることも確認済み)おかしい…。

解決法

sample_controller.rb
   ...中略...

  def new
     @url = request.url
     @sample = Sample.find(params[:id])
     respond_with(@sample)
  end

  def edit
     @url = request.url
     @sample = Sample.find(params[:id])
     respond_with(@sample)
  end

これで直った。
respond_withの後にインスタンス変数を定義しても、すでにレスポンスを返した後だから@urlはviewファイルに渡せてなかったのが原因っぽい。
respond_with(ないしrespond_to)の内部処理についてもっと深く知る必要がありそう。今回はただの感で「コード入れ替えてみたらどうでしょう?」と言って解決できたが…。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0