【问题标题】:Rails restful routes and singular resourcesRails 宁静的路线和独特的资源
【发布时间】:2011-04-30 14:57:56
【问题描述】:

我在使用 RESTful 路由和单一资源时遇到问题,最初我在帐户资源的显示视图中有此代码。

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

这是一个错误吗?通过单一资源和宁静路线的某种组合带来的?

这是在 Rails 2.3.10 上

谢谢

【问题讨论】:

  • 也许我遗漏了一些东西,但是当您拥有图书资源时,为什么还要使用:search =&gt; book.title?为什么不使用link_to book.title, book_path(book),假设您希望将用户链接到图书资源本身。
  • 这是一个人为的例子来说明错误,我承认不是特别深思熟虑。在实际应用程序中,我正在创建一个指向搜索结果的链接。

标签: ruby-on-rails rest routing


【解决方案1】:

帐户单例资源是一个红鲱鱼。您的问题只是缺少 books_url 的 :id 参数(始终是第一个参数)。您可以像这样传递其他参数:

book_url(book, :search => 'Dracula') # book.id would also work here

但必须有一本书。这就是 Rails 资源路由的工作原理。

这很奇怪,因为你应该一直在你的 books 资源上遇到这个错误。

重构代码以解决此问题的一种简单方法是在控制器的显示操作中添加一行:

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 参数 - 它使 :search 成为默认的 REST 标识符,因此如果您尝试使用 :id 您将拥有原始错误,只是使用了不同的参数。

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

【讨论】:

  • 感谢您的回复大卫,我特别喜欢您最后的建议。我设法克服这个问题的方法是使用 index 操作而不是 show 操作来显示搜索结果。 books_path(:search => book.title),然后一切正常。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多