2010-10-26 84 views
3

我有一个问题,宁静的路线和奇异的资源,原来我有我的帐户资源显示视图中的代码。Rails宁静的路线和奇异的资源

<%= 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

也许我错过了一些东西,但是为什么当你有图书资源本身时使用':search => book.title'?为什么不使用'link_to book.title,book_path(book)',假设你想将用户链接到书本资源本身。 – William 2010-10-26 16:41:34

+0

这是一个人为的例子来说明这个错误,我没有特别仔细想过。在真正的应用程序中,我创建了一个链接到搜索结果。 – dangerousdave 2010-10-26 17:21:04

回答

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你会有你的原始错误,只是与一个不同的参数。

我已经在你发布的示例应用中测试了这些解决方案,并且它们都似乎工作。

+0

感谢您的回复大卫,我特别喜欢你最后的建议。我设法克服这个问题的方法是使用索引操作而不是show操作来显示搜索结果。 books_path(:search => book.title),那么它一切正常。 – dangerousdave 2010-11-06 09:54:02