Rails控制器模型对象传递

时间:2013-12-01 04:19:28

标签: ruby-on-rails

这更像是Rails的架构/功能问题。我有一个搜索功能,它将标准发送到查询所在的模型。搜索工作。现在我有一个CSV导出链接<%= link_to“CSV”,contacts_path(格式:“csv”)%>在我的视图文件中指向localhost / books.csv。

如果没有我的搜索参数,导出就无法工作(因此localhost / book.csv?book_name = foo按预期工作)。我在send_data中做的是将@books对象传递给模型中的.to_csv函数,并且它也变为nil而不传递参数。请参阅下面的代码。

我的控制器:

def index
  @books = Book.search(params[:search])
  respond_to do |format|
    format.html
    format.csv { send_data Book.to_csv(@books) }
end

我的模特:

def self.search(criteria)
 find(:all, :conditions => ['book_name LIKE ?', "%#{criteria}%"])
end

def self.to_csv(search_results)
  CSV.generate do |csv|
   csv << column_names
   search_results.each do |contact|
     csv << contact.attributes.values_at(*column_names)
   end
  end
end

我想了解原因。当前设置似乎是向服务器发出另一个请求以生成CSV文件,这就是为什么它需要localhost / books.csv请求中的参数的原因。这是对的吗?

现在,如果我把查询放在控制器中,如下所示,CSV请求按预期工作(所以我只需点击链接并接收文件)。

 def index
   @books = Book.find(:all, :conditions => ['book_name LIKE ?', "%#{criteria}%"])       respond_to do |format|
   format.html
   format.csv { send_data Book.to_csv(@books) }
 end

我喜欢为了组织而将查询保留在模型中,如果你们能指出我正确的方向,那就太棒了。谢谢!

1 个答案:

答案 0 :(得分:1)

我建议您将链接更改为以下内容:

<%= link_to "CSV", contacts_path(params.merge(format: "csv")) %>

这将传递当前搜索参数以及格式为CSV的新选项。然后,您可以按照最初编写的方式继续将search方法保留在模型中。