#問題
業務中に開発チームメイトが、コントローラで定義した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)の内部処理についてもっと深く知る必要がありそう。今回はただの感で「コード入れ替えてみたらどうでしょう?」と言って解決できたが…。