【问题标题】:Rails - Clean way of calling model method in respond_to differently depending on the formatRails - 在respond_to中调用模型方法的干净方式取决于格式
【发布时间】:2026-01-28 01:25:01
【问题描述】:

我有一些这样的代码:

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 调用该方法> 代替。

有人推荐一种更好、更清洁或不重复的方法吗?

谢谢

【问题讨论】:

标签: ruby-on-rails-3 dry


【解决方案1】:

我会将该调用分离到一个函数中,但这只是我自己。

我会这样做:

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 参数是一致的,对吧?

【讨论】:

  • 我喜欢它。干净多了。是的,这两个是一致的:-)
最近更新 更多