将@object传递给rails部分渲染

Dav*_*d C 20 ruby activerecord ruby-on-rails

我有一个部分:

的简档/ _show.html.erb'

包含类似的代码

<%= @profile.fullname %>
Run Code Online (Sandbox Code Playgroud)

我试图渲染部分,但我不知道如何通过@profile.我尝试使用本地但显然它在我的部分而不是'@profile'上设置'profile'.

<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %>
Run Code Online (Sandbox Code Playgroud)

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

EmF*_*mFi 34

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

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

  1. 将所有实例变量更改为局部变量,并使用render的locals参数将其传递给partial.

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

部分中的实例变量也很糟糕.您永远不应该设置实例变量只是因为您的部分已经编写为使用它们.改写部分代替.

  • [另一篇文章的替代链接](http://rails-bestpractices.com/posts/27-replace-instance-variable-with-local-variable) (4认同)
  • FWIW,链接现已破裂 (2认同)

Jav*_*diz 14

确实,引用这篇博文你应该知道:

partial是一个可重用的视图模板,它允许您将组成特定页面的组件模块化为逻辑的,有凝聚力的部分.当所需数据未传递给部分数据时,通常很难在以后重复使用或更改.

导轨导向的网站介绍一些简单的使用案例:

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

因此,在您的具体情况下,有一种简单而有效的方法可以做到这一点

<%= render partial: 'show', locals: {profile: @profile} %>
Run Code Online (Sandbox Code Playgroud)

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

希望这有帮助.


Gra*_*ier 5

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

<%= render 'profiles/show', :@profile => blah %>
Run Code Online (Sandbox Code Playgroud)

现在,您的部分对象将@profile在本地看到。

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