我在使用restful路径和单一资源时遇到问题,最初我在我的帐户资源的show视图中有这个代码。
<%= link_to book.title, book_path(:search => book.title) %>
并且工作正常,然后我将帐户更改为单一资源,例如
这
map.resources :accounts
到
map.resource :account
现在我收到了错误......
book_url failed to generate from {:search=>"Dracula", :controller=>"books", :action=>"show"}, expected: {:controller=>"books", :action=>"show"}, diff: {:search=>"Dracula"}
删除代码视图行,一切正常。也将其改为
<%= link_to book.title, :controller => "books", :action => "show", :search => book.title %>
让它发挥作用。
我创建了一个独立的rails应用程序,单独展示我的问题http://github.com/jowls/singular_resource_bug
这是一个错误吗?通过一些奇异的资源和宁静的路线组合而来?
这是在轨道上2.3.10
感谢
答案 0 :(得分:3)
帐户单身人士资源是红鲱鱼。您的问题只是因为您缺少books_url的:id
参数(这始终是第一个参数)。您可以传递其他参数:
book_url(book, :search => 'Dracula') # book.id would also work here
但必须有一本书。这就是Rails的资源路径如何运作。
如果之前有效,这很奇怪,因为您应该一直在books
资源上收到此错误。
重构代码以解决此问题的一种简单方法是在控制器的show动作中添加一行:
class BooksController < ActionController::Base
def show
# If :search is blank, populate it with :id's value
params[:search] ||= params[:id]
# your code ...
end
end
然后将搜索/标题字符串作为第一个参数传递给book_url
/ book_path
:
# "Dracula" will be passed to your controller as params[:id]
book_path("Dracula")
或者,您可以覆盖默认/生成的路线,如下所示:
map.resources :books
# Explicit named routes take precedence over generated ones
map.book '/books/:search', :controller => 'books', :action => 'show'
对后一种想法的一个警告是阻止你使用:id参数代替它 - 它会:搜索默认的REST标识符,所以如果你尝试使用:id你会得到你的原始错误,只是使用不同的参数。
我已经在您发布的示例应用中测试了这些解决方案,但它们似乎都有效。