在 rails 对象上呈现不同部分的最佳方式?
Nicest way to render different partials on a rails object?
我有一个以不同方式显示的视频列表。
如果我只是以一种方式显示它,我会简单地写
<% videos.each do |video| %>
<%= render video %>
<% end %>
这加载了我的 _video.html.erb
部分,但有时我想加载不同的部分,这取决于我的观点。
根据列出的页面呈现多个视图最"Rails way"的是什么?
所以在我的主页上我可以呈现 _video.html.erb
,但在另一个页面上我可以呈现 _video_list.html.erb
。现在我只是调用方法
<%= render 'videos/video_list' locals: video %>
但我觉得有更好的方法?感觉要是能写就好了
<%= render video, 'list' %>
有什么建议吗?
谢谢
经过一番挖掘,看起来这是最好的方法
<%= render video, list: true %>
_video.html.erb
<% if local_assigns[:list] %>
#list view
<% elsif local_assigns[:select] %>
#select view
<% else %>
#default view
<% end %>
这其实感觉还不错。如果没有人提出可能更好的建议,我会在几天内将其标记为正确吗?
谢谢
如果要渲染视频集合,可以使用
<%= render videos %>
而不是
<% videos.each do |video| %>
<%= render video %>
<% end %>
要渲染 views/videos
中另一个文件的不同部分 views/videos/_list.html.erb
,您可以这样做:
<%= render 'list', video: @video %>
末尾的散列参数使实例变量 @video
在 list
部分可用,是一个名为 video
的局部变量。从技术上讲,您可以直接访问 list
部分中的 @videos
,但如果您显式传入新变量,则更容易跟踪事情。
要让同一模型根据某些条件渲染不同的模板,您可以在任何对象上实现 to_partial_path
方法并在该对象上调用渲染:
def to_partial_path
if list?
"videos/list"
else
"videos"
end
end
Right now I'm just calling the method
<%= render 'videos/video_list' locals: video %>
那应该行不通。
它是:
<%= render 'videos/video_list', video: video %>
或者:
<%= render partial: 'videos/video_list', locals: { video: video } %>
绝对比任何 "clever" 自动魔术助手都更正确、明确、简单和有弹性。
我有一个以不同方式显示的视频列表。 如果我只是以一种方式显示它,我会简单地写
<% videos.each do |video| %>
<%= render video %>
<% end %>
这加载了我的 _video.html.erb
部分,但有时我想加载不同的部分,这取决于我的观点。
根据列出的页面呈现多个视图最"Rails way"的是什么?
所以在我的主页上我可以呈现 _video.html.erb
,但在另一个页面上我可以呈现 _video_list.html.erb
。现在我只是调用方法
<%= render 'videos/video_list' locals: video %>
但我觉得有更好的方法?感觉要是能写就好了
<%= render video, 'list' %>
有什么建议吗? 谢谢
经过一番挖掘,看起来这是最好的方法
<%= render video, list: true %>
_video.html.erb
<% if local_assigns[:list] %>
#list view
<% elsif local_assigns[:select] %>
#select view
<% else %>
#default view
<% end %>
这其实感觉还不错。如果没有人提出可能更好的建议,我会在几天内将其标记为正确吗?
谢谢
如果要渲染视频集合,可以使用
<%= render videos %>
而不是
<% videos.each do |video| %>
<%= render video %>
<% end %>
要渲染 views/videos
中另一个文件的不同部分 views/videos/_list.html.erb
,您可以这样做:
<%= render 'list', video: @video %>
末尾的散列参数使实例变量 @video
在 list
部分可用,是一个名为 video
的局部变量。从技术上讲,您可以直接访问 list
部分中的 @videos
,但如果您显式传入新变量,则更容易跟踪事情。
要让同一模型根据某些条件渲染不同的模板,您可以在任何对象上实现 to_partial_path
方法并在该对象上调用渲染:
def to_partial_path
if list?
"videos/list"
else
"videos"
end
end
Right now I'm just calling the method
<%= render 'videos/video_list' locals: video %>
那应该行不通。
它是:
<%= render 'videos/video_list', video: video %>
或者:
<%= render partial: 'videos/video_list', locals: { video: video } %>
绝对比任何 "clever" 自动魔术助手都更正确、明确、简单和有弹性。