Rails宁静的路线和奇异的资源

时间:2010-10-26 08:10:40

标签: ruby-on-rails rest routing

我在使用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

感谢

1 个答案:

答案 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你会得到你的原始错误,只是使用不同的参数。

我已经在您发布的示例应用中测试了这些解决方案,但它们似乎都有效。