将@object传递给rails部分渲染

时间:2009-12-05 02:26:24

标签: ruby-on-rails ruby activerecord

我有一个部分:

的简档/ _show.html.erb'

包含类似

的代码
<%= @profile.fullname %>

我正在尝试渲染部分但我不确定如何传递@profile。我尝试使用本地但显然它在我的部分而不是'@profile'上设置'profile'。

<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %>

无论如何将它作为@object而不是对象传递,还是以这种方式设计?

5 个答案:

答案 0 :(得分:33)

为什么在部分中使用实例变量(名称以'@'开头的变量,例如:@object)如此重要?进入并不是一个好习惯。在partials中使用实例变量会使控制流变得复杂,这会导致错误并使部分重用变得更加困难。这个blog post更深入地解释了这个问题。

你真的有两种选择。第一个选项是建议的解决方案。

  1. 将所有实例变量更改为局部变量,并将其传递给具有渲染的locals参数的partial。

  2. 在渲染部分之前设置实例变量。 Partials可以访问控制器设置的所有实例变量。

  3. 部分中的实例变量再次变坏。您永远不应该设置实例变量只是因为您的部分已经编写为使用它们。改为改写部分。

答案 1 :(得分:14)

确实,引用this博客文章你应该知道:

  

部分是可重复使用的视图模板,它允许您模块化   构成特定页面的组件成为逻辑的,有凝聚力的   件。当需要的数据没有传递给部分数据时,通常是这样   以后很难重复使用或改变。<​​/ p>

rails guides网站解释了一些简单的用例:

  

您还可以将局部变量传递给局部变量,使其更加明显   强大而灵活。例如,您可以使用此技术   减少新页面和编辑页面之间的重复,同时仍保持一个   一点点不同的内容...

因此,在您的具体情况下,有一种简单而有效的方法

<%= render partial: 'show', locals: {profile: @profile} %>

额外提示:
可能部分命名的节目不是一个好的选择,给它一个更有意义的名称与你试图重用的东西相关。当您实际拥有 show 方法时,这听起来更容易出现错误/混乱,因此可能是 _show.html.erb 文件和 show.html.erb 文件。

希望这会有所帮助。

答案 2 :(得分:4)

对于Rails 3+,您实际问题的答案是:

<select ng-options="user.name for user in users" ng-model="default.name"></select>

您的部分人现在会在本地看到<%= render 'profiles/show', :@profile => blah %>

我不是说这是一个好方法。老实说,我不确定这是否丑陋。但它确实有效。

答案 3 :(得分:1)

您可以随时在部分内进行@profile = profile

答案 4 :(得分:1)

这更简单

<%= render :partial => "profiles/show", :collection => @profiles %>

on partial _show.html.erb

<%= profile.fullname %>

希望帮助