男人有很多这些问题,但到目前为止我还没有找到我的特殊问题。
当我运行rake路线时,我有这个自定义路线显示(这不是我计划长期测试路由的方式)。
# routes.rb
match 'books/:id/file/:name' => 'home#download', :as => :download_book, :via => :get
# rake routes
download_book GET /book/:id/file/:name(.:format) {:controller=>"books", :action=>"download"}
在视图中我有
= link_to name, download_book_path(@book.id, name: name)
当然我的HomeController
已经提供了另一个简单的自定义路线,因此我知道它正在运行,但已定义了download
个动作。
所以百万美元的问题是这个错误的原因吗?
ActionView::Template::Error (No route matches {:controller=>"home", :action=>"download", :name=>"test.zip", :id=>"fcd5c87aef84874eec8f08cc313da85c"}):
14: %p
15: %b Published:
16: - @book.attachments.keys.each do |name|
17: = link_to name, download_book_path(@book.id, name: name)
答案 0 :(得分:3)
问题是name
变量中的点,它在路线中无法正常使用,因为它与标准(.:format)
路段相冲突,正如您在{{1调用。
解决方案可以在the rails guide on routing.中找到:
默认情况下,动态细分不接受点 - 这是因为点用作格式化路线的分隔符。如果您需要在动态细分中使用点,请添加一个覆盖此约束的约束 - 例如:id => / [^ /] + /允许除斜杠之外的任何东西。
所以如果你喜欢他们在这里说并改变约束以允许点,它应该工作:
rake routes
旁注,在您的示例中,您在散列中传递match ..., :constraints => { :name => /[^\/]+/ }
,这将被解释为查询字符串变量。
name