将@object传递给rails部分渲染

我有一个部分:

的简档/ _show.html.erb’

包含类似的代码

 

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

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

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

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

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

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

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

部分中的实例变量也很糟糕。 您永远不应该设置实例变量,因为已经编写了部分文件以使用它们。 改写部分代替。

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

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

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

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

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

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

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

希望这有帮助。

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

 <%= render 'profiles/show', :@profile => blah %> 

你的部分人现在@profile在本地看到@profile

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

您可以随时在部分中执行@profile = profile

这更简单

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

在部分_show.html.erb上

 <%= profile.fullname %> 

希望有所帮助