2012-05-22 29 views
0

有一个关于rails的真正基本问题 - 花费在网络上查找解决方案的小时数 - 但找不到解决方案。Rails - 研究如何通过链接访问控制器的方法

我只需要调用一个链接点击的方法。

这个想法是我需要导出一个由控制器中的方法生成的xml文件。

firms_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' %> 

在我看来喜欢的事,应该是很简单的 - 但不能让它开始工作。

我得到的错误:在firms_controller

def show 
    @firm = Firm.find(params[:id]) 
    end 

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' 

show方法试图与路线搞乱得到它与无济于事工作。

感谢您的帮助

回答

2

试试这个

在路线写你的资源上面我们对公司控制

match 'firms/xml', :controller => 'firms', :action => 'xml',:as => :firms_xml 

写在下面的方式

<%= link_to "XML", firms_xml_path %> 
1

这看起来像路由问题或链接问题。您是否需要将ID参数传递给XML控制器方法?您的示例链接没有显示。你需要查找如何通过您的link_to辅助参数:

http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to

如果你在routes.rb中的默认路由设置:

匹配“:控制器(/:动作(/: ID))(:格式)”

那么你的link_to应该是这样的:

的link_to “XML”:控制器=> “公司”,:动作=> “XML”:ID => 1234

其中1234是你试图查找的实际ID。

+0

想你的建议链接这一点 - 但得到了同样的错误(但是url改为:http:// localhost:3000/firm/xml?id = 1)。我不需要通过任何参数的方法 - 因为我需要它返回所有的“公司”。有没有更简单的方法来做到这一点,你会推荐什么路线? – jmc

1

检查链接网址!

我不认为这是你的期望。当您通过hash1.merge(hash2)合并两个哈希值时,任何重复的键都会从hash2中产生这些哈希值。自从(如果我没记错的话),params散列表有:action:controller键在Rails的路由过程中添加到它上面,你的预期路由被当前(显示)页面的路由覆盖。

你可以尝试reverse_merge,它会给你一个更可预测的结果,但我会建议使用Rails的路径生成助手,让您的生活更轻松:

<%= link_to "XML", firm_xml_path(@firm) %> 

希望帮助!

+0

喂 - 试过的link_to “XML”,xml_firms_path(@firm) 但是它具有不同PARAMS再次投掷以下错误:找不到事务所与ID = XML <{"format"=> [ “1”, “2”, “3 ”, “4”, “5”, “6”, “7”, “8”, “9”, “10”], “ID”=> “XML”} ....我不希望页面刷新,我只是想要它评估控制器中的功能,它将下载一个XML文件 – jmc