我有一个部分:
的简档/ _show.html.erb'
包含类似
的代码<%= @profile.fullname %>
我正在尝试渲染部分但我不确定如何传递@profile。我尝试使用本地但显然它在我的部分而不是'@profile'上设置'profile'。
<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %>
无论如何将它作为@object而不是对象传递,还是以这种方式设计?
答案 0 :(得分:33)
为什么在部分中使用实例变量(名称以'@'开头的变量,例如:@object)如此重要?进入并不是一个好习惯。在partials中使用实例变量会使控制流变得复杂,这会导致错误并使部分重用变得更加困难。这个blog post更深入地解释了这个问题。
你真的有两种选择。第一个选项是建议的解决方案。
将所有实例变量更改为局部变量,并将其传递给具有渲染的locals参数的partial。
在渲染部分之前设置实例变量。 Partials可以访问控制器设置的所有实例变量。
部分中的实例变量再次变坏。您永远不应该设置实例变量只是因为您的部分已经编写为使用它们。改为改写部分。
答案 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 %>
希望帮助