Rails - 根据格式不同,在respond_to中调用模型方法的简洁方法

时间:2012-03-06 01:14:25

标签: ruby-on-rails-3 dry

我有一些像这样的代码:

respond_to do |format|
 format.html { @all_activities = current_user.recent_activities(@size_per_page,params[:start],nil) }
 format.csv { @all_activities = current_user.recent_activities(nil,params[:start],nil); build_activity_csv }
 format.xls { @all_activities = current_user.recent_activities(nil,params[:start],nil); 
   send_data(build_excel_all, :filename => "#{Time.now.strftime('%Y-%m-%d')}_Activity_All.xls", :type => "application/xls", :disposition => 'attachment')
   }
   format.js { @all_activities = current_user.recent_activities(@size_per_page,params[:start],nil) }
   format.pdf { @all_activities = current_user.recent_activities(nil,params[:start],nil); prawnto :filename => "#{Time.now.strftime('%Y-%m-%d')}_Activity_All", :inline => false 
}
end

如您所见,我使用不同格式调用相同的方法,但在某些情况下我使用 @size_per_page 变量,有时我使用 nil 而不是。

有人建议采用更好,更清洁或不重复的方式吗?

由于

1 个答案:

答案 0 :(得分:0)

我将该调用分成一个函数,但那只是我。

我将如何做到这一点:

respond_to do |format|
  format.html { set_all_activities(@size_per_page) }
  format.js { set_all_activities(@size_per_page) }
  format.csv do
    set_all_activities(nil)
    build_activity_csv
  end
  format.xls do 
    set_all_activities(nil)
    send_data(
      build_excel_all, 
      :filename    => "#{Time.now.strftime('%Y-%m-%d')}_Activity_All.xls",
      :type        => "application/xls",
      :disposition => 'attachment')
  end
  format.pdf do 
    set_all_activities(nil)
    prawnto(
      :filename => "#{Time.now.strftime('%Y-%m-%d')}_Activity_All",
      :inline   => false)
  end
end


def set_all_activities(size)
  @all_activities = current_user.recent_activities(size, params[:start], nil)
end

我假设params[:start]且最后一个nil参数是一致的,对吗?