1

テンプレートで実行される render :partial 呼び出しで、Rails がコントローラーのインスタンス変数を上書きするケースはありますか? たとえば、次のようにします。

コントローラ

def my_action
   @widget = Widget.find(params[:id])
end    

my_action.html.erb を見る

Hi there.
<%= render :partial => 'my_helper' %>
That's it, that's all.

ビュー_my_helper.html.erb

The id is <%= @widget.id.to_s %>.

@widget が my_helper で使用されたときに nil になるという文書化されたシナリオ (バグまたは設計によるもの) はありますか? アプリケーションでこの動作が見られますが、そのソースを突き止めることができませんでした。

いくつかの注意事項:
* アプリは Rails 2.1.1 で実行されています。
* render :partial => my_helper 呼び出しにローカルを割り当てることは可能ですが、多くの理由から、この場合ローカルは理想的ではありません。
* ActionController と ActionView をふるいにかけるのにかなりの時間を費やしましたが、動作を分離することはできませんでした。

4

2 に答える 2

2

いいえ、Rails はパーシャルのインスタンス変数を上書きしません。

次のように考えてください。ビューはコントローラーのすべてのインスタンス変数にアクセスでき、パーシャルはビューの一部です。

ただし、異なるコントローラーに属するビューで共有パーシャルが使用されるユースケースが存在する可能性があります。その場合、異なるコントローラーのメソッド内でインスタンス変数の名前を同じに保ちたくない場合があるため、パーシャル内のコードは混乱を招きます。このような場合は、ローカル ハッシュを使用する方が適切でクリーンなオプションです。

于 2009-09-02T19:58:44.997 に答える
1

これはやや不十分な提案です: 実用的な場合は、別の変数名を使用してみてください。

別の方法として、古い Pragmatic Programmer の「トレーサーの弾丸」のアイデアがあります。コントローラーにダミー変数を作成し、さまざまなビュー/フラグメントで出力して、これらの値のスコープ/有効期間が本当に期待どおりであることを確認します。一意の名前 (または書いたことを忘れたコード) のために、この 1 つの変数を「何か」が踏んでいます。

最後に、あなたは試しました:

% find . -name '*rb*' | xargs grep -B 2 -A 2 -n '@widget'

または、アプリケーション内の同様のコード検索ですよね? Rails バージョンを「フリーズ」すると、すべての Rails フレームワーク コードがアプリケーション内にネストされ、それも検索できることに注意してください。

于 2009-06-27T01:30:30.487 に答える