Rails:如何在不同视图中进行小的更改

时间:2016-06-02 11:16:31

标签: ruby-on-rails ruby ruby-on-rails-4

是否可以在不同的视图中进行小的更改?

index.html.erbshow.html.erb中呈现相同的部分,如下所示。

index.html.erb

<%= render @schedules %> 

show.html.erb

<%= render @schedules %> 

我想做的是不在index.html.erb中显示一些值。 (并在erb中显示一些值)

例如,我只想在start_at中显示end_atshow.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政策相矛盾。

如果你能给我任何想法,我将不胜感激。

4 个答案:

答案 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 %>