又一个“没有路线匹配”的问题

时间:2011-09-19 01:15:22

标签: ruby-on-rails ruby-on-rails-3.1

男人有很多这些问题,但到目前为止我还没有找到我的特殊问题。

当我运行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)

1 个答案:

答案 0 :(得分:3)

问题是name变量中的点,它在路线中无法正常使用,因为它与标准(.:format)路段相冲突,正如您在{{1调用。

解决方案可以在the rails guide on routing.中找到:

  

默认情况下,动态细分不接受点 - 这是因为点用作格式化路线的分隔符。如果您需要在动态细分中使用点,请添加一个覆盖此约束的约束 - 例如:id => / [^ /] + /允许除斜杠之外的任何东西。

所以如果你喜欢他们在这里说并改变约束以允许点,它应该工作:

rake routes

旁注,在您的示例中,您在散列中传递match ..., :constraints => { :name => /[^\/]+/ } ,这将被解释为查询字符串变量。

name