web-dev-qa-db-ja.com

Ruby on Rails

コントローラーとビューの間でインスタンス変数を共有するのはよくないと聞いたのはなぜですか。コントローラから何かが来ていることを@を介してすぐに確認できるので、私はそれが好きです。コントローラでヘルパーを使用する素晴らしい方法がここにあります: http://www.stephencelis.com/2008/09/06/Rails-controllers-views-and-variables.html 。しかし、私はその部分にカンカンを使用しています。

12
Amala

Railsベストプラクティス: インスタンス変数をローカル変数で置き換える

基本的に、パーシャルを多く使用しない場合、または各コントローラーメソッドに単一のプレーンビューがある場合、ビューでインスタンス変数を使用するだけで問題は発生しません。

それでも、多くのパーシャルを使用し、そのためコントローラーで多くのインスタンス変数が宣言されている場合、コントローラー(インスタンス)変数を明示的にパーシャルに渡す代わりに使用すると、混乱が少なくなる可能性があります。その方法-パーシャルVIEWでの作業中-ページの作成に含まれる「すべての」パーシャルとは共有されない、使用したい変数/オブジェクトへの明示的な参照が1つあります。

結局のところ、これはあなたがそれを処理したいのと同じように処理することができます。しかし、私の個人的な見解は、他の変数と混同されないように、パーシャル/ビューに明示的に参照を付けるという考えが好きだということです。

11
Ingo

global変数または参照によって渡される変数から類推を得ることができ、パーシャルを関数と考えることができます。したがって、インスタンス変数の使用は、長所と短所のすべてを参照として関数に渡される変数によく似ています。

# controller 
def index
  @var = 1
end

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo' %><br/>
<%= @var %>

#partial _foo.html.erb
<%= @var = 2 %>

結果は

1
2
2

このような動作が必要な場合がありますが、ほとんどの場合は必要ありません。また、この方法でバグを導入する方が簡単で、追跡が困難になります。ビューとパーシャルで使用される変数のスコープを分離するため、これが推奨される理由です。

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo', var: @var %><br/>
<%= @var %>

#partial _foo.html.erb
<%= var = 2 %>

結果:

1
2
1
5
Grzegorz