将@object传递给rails部分渲染
我有一个部分:
的简档/ _show.html.erb’
包含类似的代码
我试图渲染部分,但我不知道如何通过@profile。 我尝试使用本地但显然它在我的部分而不是’@profile’上设置’profile’。
'profiles/show', :locals => {:profile => @app.profile} %>
无论如何将它作为@object而不是对象传递,还是以这种方式设计?
为什么在部分中使用实例变量(名称以’@’开头的变量,例如:@object)如此重要? 进入并不是一个好习惯。 在partials中使用实例变量会使控制流变得复杂,这会导致错误并使部分重用变得更加困难。 这篇博文更深入地解释了这个问题。
真的,你有两个选择。 第一个选项是建议的解决方案。
-
将所有实例变量更改为局部变量,并使用render的locals参数将其传递给partial。
-
在呈现部分之前设置实例变量。 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 %>
希望有所帮助