有关于rails的一个非常基本的问题 - 花费数小时在互联网上寻找解决方案 - 但无法找到解决方案。
我只需要点击一个链接就可以调用一个方法。
我的想法是我需要导出一个由控制器中的方法生成的xml文件。
firm_controller.rb(exerpt)
.....def xml
@entries = Entry.find(:all)
send_data @entries.to_xml,
:type => 'text/xml; charset=UTF-8;',
:disposition => "attachment; filename=entries.xml"
end....
我只需要从公司视图页面调用此方法来获取要下载的xml文件,但无法让它运行起来。 XML代码确实有效 - 如果我将它添加到控制器中的索引方法,它可以完美地工作。
这是我在阅读一些在线文章后试图让链接正常工作的一些方法。
<% url = url_for({:action => "xml", :controller => 'firms'}.merge(params)) %>
<%= link_to "XML", url %>
最基本的尝试方法
<%= link_to "XML", :action => 'xml' %>
在我看来,这似乎应该非常简单 - 但却无法让它发挥作用。
我得到的错误:
ActiveRecord::RecordNotFound in FirmsController#show
Couldn't find Firm with ID=xml
Rails.root: /home/james/rails/KPSmart
Application Trace | Framework Trace | Full Trace
app/controllers/firms_controller.rb:25:in `show'
在firm_controller中显示方法
def show
@firm = Firm.find(params[:id])
end
尝试弄乱路线以使其无效。
感谢您的帮助
答案 0 :(得分:2)
试试这个
在路线中写下我们为公司控制器编写的资源
match 'firms/xml', :controller => 'firms', :action => 'xml',:as => :firms_xml
并按以下方式链接
<%= link_to "XML", firms_xml_path %>
答案 1 :(得分:1)
这看起来像路由问题或链接问题。您是否需要将ID参数传递给XML控制器方法?您的示例链接未显示该内容。您需要查找如何在link_to帮助器中传递参数:
http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to
如果您在routes.rb中设置了默认路由:
匹配':控制器(/:动作(/:id))(:格式)'
然后你的link_to应该如下:
link_to“XML”,:controller =&gt; “公司”,:action =&gt; “xml”,:id =&gt; 1234
其中1234是您尝试查找的实际ID。
答案 2 :(得分:1)
检查链接网址!
我认为这不是你所期待的。当您通过hash1.merge(hash2)
合并两个哈希值时,任何重复的键都会产生hash2
的哈希值。而且,因为(如果我没记错的话)params
哈希在Rails的路由过程中添加了:action
和:controller
个密钥,那么您的预期路由会被当前路由覆盖(显示)页面。
你可以尝试reverse_merge
,这会给你一个更可预测的结果,但我建议使用Rails的路径生成助手让你的生活更轻松:
<%= link_to "XML", firm_xml_path(@firm) %>
希望有所帮助!