1

是否存在 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 %>.

在 my_helper 中使用 @widget 时,是否有任何记录在案的场景(错误或设计)?我在应用程序中看到了这种行为,但无法追踪其来源。

一些注意事项:
* 该应用程序在 Rails 2.1.1 中运行。
* 虽然可以将局部变量分配给渲染 :partial => my_helper 调用,但由于多种原因,局部变量在这种情况下并不理想。
* 我花了很多时间筛选 ActionController 和 ActionView,但无法隔离行为。

4

2 回答 2

2

不,Rails 不会覆盖部分中的实例变量。

可以这样想:视图可以访问控制器的所有实例变量,并且部分是视图的一部分。

但是,可能存在在属于不同控制器的视图中使用共享部分的用例。在这种情况下,部分中的代码会变得混乱,因为您可能不希望在不同控制器的方法中保持实例变量的名称相同。在这种情况下,使用本地哈希是一个更好、更清洁的选择

于 2009-09-02T19:58:44.997 回答
1

这是一个有点蹩脚的建议:如果可行,请尝试使用不同的变量名。

或者,有旧的 Pragmatic Programmer “跟踪子弹”想法:在控制器中创建一个虚拟变量,您可以在各种视图/片段中打印出来,只是为了确保这些值的范围/生命周期确实是您所期望的,而不是由于其唯一的名称(或您忘记编写的代码),“某事”踩在这个变量上。

最后,您确实尝试过:

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

或在应用程序中进行类似的代码搜索,对吗?请注意,如果您“冻结”您的 rails 版本,所有 rails 框架代码都将嵌套在您的应用程序中,您也可以对其进行搜索。

于 2009-06-27T01:30:30.487 回答