代码之家  ›  专栏  ›  技术社区  ›  dangerousdave

Rails restful路由和单一资源

  •  3
  • dangerousdave  · 技术社区  · 14 年前

    我对restful路由和单一资源有问题,最初我在account资源的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 %>
    

    让它工作。

    http://github.com/jowls/singular_resource_bug

    这是虫子吗?通过一些单一资源和restful路径的组合?

    这是在rails 2.3.10上

    1 回复  |  直到 14 年前
        1
  •  3
  •   David Demaree    14 年前

    单一资源帐户是一个危险的东西。你的问题是你错过了 :id books_url的参数(始终是第一个参数)。您可以传入其他参数,例如:

    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
    

    然后将search/title字符串作为第一个参数传递给 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参数institud会使:搜索默认REST标识符,因此如果尝试使用:id,则会出现原始错误,只是使用了不同的参数。

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