是否存在Rails覆盖渲染上的控制器实例变量的任何情况:在模板中执行部分调用?例如,假设我们有:
def my_action
@widget = Widget.find(params[:id])
end
Hi there.
<%= render :partial => 'my_helper' %>
That's it, that's all.
_my
_ helper.html.erb The id is <%= @widget.id.to_s %>.
在my_helper中使用@widget时,是否存在任何记录的情况(错误或设计)?我在应用程序中看到此行为,但无法追踪其来源。
一些注意事项:
*该应用程序在Rails 2.1.1中运行
*虽然可以将本地分配给渲染:partial =&gt; my_helper电话,由于种种原因,本地人在这种情况下并不是很理想
*我花了大量时间筛选ActionController和ActionView,但无法隔离行为。
答案 0 :(得分:2)
不,Rails不会覆盖部分中的实例变量。
可以这样想:视图可以访问控制器的所有实例变量,而部分是视图的一部分。
但是,可能存在在属于不同控制器的视图中使用共享部分的用例。在这种情况下,部分内的代码会变得混乱,因为您可能不希望在不同控制器的方法中保持实例变量的名称相同。在这种情况下,使用locals哈希是一个更好,更清晰的选择
答案 1 :(得分:1)
这是一个有点蹩脚的建议:如果可行,请尝试使用其他变量名称。
或者,还有旧的Pragmatic Programmer“tracer bullets”的想法:在控制器中创建一个虚拟变量,您可以在各种视图/片段中打印出来,以确保这些值的范围/生命周期真正符合您的预期因为它的唯一名称(或者你忘记写的代码)而不是“某事”踩到这个变量。
最后,你确实尝试过:
% find . -name '*rb*' | xargs grep -B 2 -A 2 -n '@widget'
或在应用程序中进行类似的代码搜索,对吗?请注意,如果您“冻结”rails版本,所有rails框架代码将嵌套在您的应用程序中,您也可以搜索它。