这更像是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
我喜欢为了组织而将查询保留在模型中,如果你们能指出我正确的方向,那就太棒了。谢谢!
答案 0 :(得分:1)
我建议您将链接更改为以下内容:
<%= link_to "CSV", contacts_path(params.merge(format: "csv")) %>
这将传递当前搜索参数以及格式为CSV的新选项。然后,您可以按照最初编写的方式继续将search
方法保留在模型中。