将过滤器代码移动到Controller或Helper中?

时间:2013-12-12 19:05:07

标签: ruby-on-rails ruby filter controller helper

我的应用程序有一个位置,每个位置可以根据分配给它的方向面具有多个日历。

现在,要过滤与日历对应的正确事件,我将其呈现在 位置显示视图

Location.html.erb

<%= render partial: @directional_faces %>

_directional_face.html.erb

<%= directional_face.name %>
<% @filtered_event_strips = directional_face.campaigns.event_strips_for_month(@shown_month, @first_day_of_week)%>
<%= raw(event_calendar) %>

这部分代码:

<% @filtered_event_strips = directional_face.campaigns.event_strips_for_month(@shown_month, @first_day_of_week)%>

允许显示多个日历的概念,然后仅根据显示的方向面显示属于该日历的广告系列。

如果可能的话,我想将其移动到控制器或帮助器中,与渲染的部分相对应。或者可以离开那里?

更多详情

calendar_helper.rb

def event_calendar_opts
  { 
   :year => @year,
   :month => @month,
   :event_strips => @filtered_event_strips,
   :month_name_text => I18n.localize(@shown_month, :format => "%B %Y"),
   :previous_month_text => month_link(@shown_month.prev_month),
   :next_month_text => month_link(@shown_month.next_month),
   :first_day_of_week => @first_day_of_week,   
   }
  end

地点控制器#show

def show
    @month = (params[:month] || (Time.zone || Time).now.month).to_i
    @year = (params[:year] || (Time.zone || Time).now.year).to_i
    @shown_month = Date.civil(@year, @month)
    @first_day_of_week = 1
end

1 个答案:

答案 0 :(得分:0)

绝对把它放在控制器中。如果它是一个常见的东西(超过2个视图使用),我会把它放在DirectionalFace模型上,使它更容易。有点像

def filtered_event_strips(shown_month, first_day_of_week
  self.campaigns.event_strips_for_month(shown_month, first_day_of_week)
end

另外,请注意您传递给视图的实例变量数量。你有3个线路。通常有一种更简单的方法可以将信息保存在控制器/模型中。另外,请确保在真正需要时只使用@。例如,@filtered_events_strips不仅仅是filtered_event_strips,在这种背景下也没有意义。