コントローラーとビューの間でインスタンス変数を共有するのは良くないと聞いたのはなぜですか。@を介してコントローラから何かが送信されていることがすぐにわかるので、それが好きです。:私はここのコントローラでヘルパーを使用するための良い方法を参照http://www.stephencelis.com/2008/09/06/rails-controllers-views-and-variables.htmlを。しかし、私はその部分にカンカンを使用しています。
コントローラーとビューの間でインスタンス変数を共有するのは良くないと聞いたのはなぜですか。@を介してコントローラから何かが送信されていることがすぐにわかるので、それが好きです。:私はここのコントローラでヘルパーを使用するための良い方法を参照http://www.stephencelis.com/2008/09/06/rails-controllers-views-and-variables.htmlを。しかし、私はその部分にカンカンを使用しています。
回答:
このアイデアはRailsのベストプラクティスに記載されています。インスタンス変数をローカル変数に置き換えます
基本的に、多くのパーシャルを使用しない場合、または各コントローラーメソッドに対して単一のプレーンビューがある場合、ビューでインスタンス変数を使用するだけでも、実際には問題は発生しません。
それでも、多くのパーシャルを使用しているため、コントローラーで多くのインスタンス変数が宣言されている場合、コントローラー(インスタンス)変数をパーシャルに明示的に渡すという代替手段を使用すると、混乱が少なくなる可能性があります。そのように-部分VIEWでの作業中に、ページの作成に含まれる「すべて」の部分と共有されない、操作したい変数/オブジェクトへの明示的な参照が1つあります。
結局のところ、あなたはそれをあなたがそれを処理したいのと同じように処理することができ、誰もあなたがそれ以外の方法でそれをするようにあなたに言うことはありません。しかし、私の個人的な見解は、他の変数と混同できないパーシャル/ビューで明示的に参照するというアイデアが好きだということです。
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