Rails - 研究如何通过链接从控制器访问方法

时间:2012-05-22 03:14:56

标签: ruby-on-rails ruby ruby-on-rails-3

有关于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

尝试弄乱路线以使其无效。

感谢您的帮助

3 个答案:

答案 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) %>

希望有所帮助!