是否可以在不同的视图中进行小的更改?
在index.html.erb
和show.html.erb
中呈现相同的部分,如下所示。
index.html.erb
<%= render @schedules %>
show.html.erb
<%= render @schedules %>
我想做的是不在index.html.erb中显示一些值。 (并在erb中显示一些值)
例如,我只想在start_at
中显示end_at
和show.html.erb
,并在erb中显示title
。
_schedule.html.erb
<% schedule.rooms.each_with_index do |a, idx| %>
<% a.events.each do |e| %>
<%= l(e.start_at) %>-<%= l(e.end_at) %> # display only show.html.erb
<%= e.title %> #display both erb
...
<% end %>
...
<% end %>
Althogh我想出了我创造两个部分的想法,它与DRY政策相矛盾。
如果你能给我任何想法,我将不胜感激。
答案 0 :(得分:2)
您可以使用controller.action_name
。
<% if controller.action_name == 'show' %>
<%= l(e.start_at) %>-<%= l(e.end_at) %> # display only show.html.erb
<% end %>
params
哈希还包含action_name。
答案 1 :(得分:1)
可以在页面上查看当前操作和当前控制器。因此,我们可以从不同的操作中调用单个部分,并可以根据操作名称或操作和控制器名称进行自定义。
例如
<% schedule.rooms.each_with_index do |a, idx| %>
<% a.events.each do |e| %>
<% if @current_controller == "events" and @current_action == "show" %>
<%= l(e.start_at) %>-<%= l(e.end_at) %> # display only show.html.erb
<% end %>
<%= e.title %> #display both erb
...
<% end %>
...
<% end %>
还需要更新Application Controller。
class ApplicationController < ActionController::Base
before_filter :instantiate_controller_and_action_names
def instantiate_controller_and_action_names
@current_controller = controller_name
@current_action = action_name
end
end
答案 2 :(得分:1)
action_name
已经足够了,但我个人并不喜欢这个。我会做两个不同的部分。
答案 3 :(得分:0)
您可以使用CSS根据上下文隐藏/显示内容。
在实践中,我发现这是一种重用差异较小的部分的好方法。特别是当这些差异不需要花费任何费用来计算,即打印日期
<li>
适用于简单的用例。如果/当你有多个需要渲染部分的地方时,它会变得笨重。 CSS解决方案只需要另一个包装器<% if controller.action_name == 'show' %>
和相关的CSS样式。
<强> show.html.erb 强>
<div class="schedules--whatever">
<强> index.html.erb 强>
<div class="schedules--show">
<%= render @schedules %>
</div>
<强> _schedule.html.erb 强>
<div class="schedules--index">
<%= render @schedules %>
</div>
<强> schedules.css 强>
<% schedule.rooms.each_with_index do |a, idx| %>
<% a.events.each do |e| %>
<div class="event__date">
<%= l(e.start_at) %>-<%= l(e.end_at) %>
</div>
<%= e.title %>
...
<% end %>
...
<% end %>