我有一个RoR应用程序日志,类似于书店应用程序,我的logs_controller具有所有默认操作:索引,显示,更新,创建,删除..
现在我需要添加新动作:toCSV,我在logs_controller中定义它,并在config / routes中添加新路由:
map.resources :logs, :collection => { :toCSV => :get }.
来自irb,我检查了路线,看到已添加的新路线:
>> rs = ActionController::Routing::Routes >> puts rs.routes GET /logs/toCSV(.:format)? {:controller=>"logs", :action=>"toCSV"}
然后在shell中运行'rake routes'命令,它返回:
toCSV_logs GET /logs/toCSV(.:format) {:controller=>"logs", :action=>"toCSV"}一切似乎都有效。最后在我的视图代码中,我添加了以下内容:
link_to 'Export to CSV', toCSV_logs_path
在浏览器“http://localhost:3000/logs/toCSV”中访问它时,它抱怨道: 找不到ID = toCSV
的Log我检查了脚本/服务器,看到了这个:
ActiveRecord::RecordNotFound (Couldn't find Log with ID=toCSV): app/controllers/logs_controller.rb:290:in `show'
当我点击该链接时,它会将其指向动作'show'而不是'toCSV',因此它将'toCSV'作为一个id ...任何人都知道为什么会发生这种情况?并解决它?谢谢......
答案 0 :(得分:2)
map.resources :logs, :collection => { :toCSV => :get }
我认为这很完美。每次更改config / routes.rb时都必须重新启动服务器 这个答案很难,但很重要。
答案 1 :(得分:1)
这可以解决方法: 创建命名资源:
map.toCSV 'logs\toCSV', :controller => :logs, :action => :toCSV
我真的很抱歉,我忘了提到要点!
在您看来应该是:
link_to 'Export to CSV', toCSV_path
此外,这些命名路由会派上用场,特别是在涉及身份验证时。例如,在注册过程中,您可以将用户定向到\user\new
,而不是将用户定向到\signup
。它更友好。
多数民众赞成!!
它更简单,它的工作原理。干杯! :)
答案 2 :(得分:0)
从routes.rb中删除map.resources行,然后运行rake路由。如果您看到route / logs /:id,那么该路径应该被删除。