gpt4 book ai didi

ruby-on-rails - Rails Restful 路线和单一资源

转载 作者:行者123 更新时间:2023-12-01 16:23:43 24 4
gpt4 key购买 nike

我在使用 restful 路由和单一资源时遇到问题,最初我在帐户资源的显示 View 中有这段代码。

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

去掉view那行代码,一切正常。也改成

<%= link_to book.title, :controller => "books", :action => "show", :search => book.title %>

让它发挥作用。

我已经创建了一个独立的 Rails 应用程序来单独演示我的问题 http://github.com/jowls/singular_resource_bug

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

这是在 rails 2.3.10 上

谢谢

最佳答案

帐户单例资源是一个转移注意力的问题。您的问题只是缺少 books_url 的 :id 参数(它始终是第一个参数)。您可以像这样传递额外的参数:

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

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

如果这在以前有效,那就很奇怪了,因为你应该一直在你的 books 资源上遇到这个错误。

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

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,您将拥有您的原始错误,只是参数不同。

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

关于ruby-on-rails - Rails Restful 路线和单一资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com