Rails успокоительные маршруты и особые ресурсы - PullRequest
3 голосов
/ 26 октября 2010

У меня проблема с маршрутами отдыха и единичными ресурсами, изначально у меня был этот код в представлении 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

Это ошибка? вызвано какой-то комбинацией уникальных ресурсов и спокойных маршрутов?

Это было на рельсах 2.3.10

спасибо

1 Ответ

3 голосов
/ 05 ноября 2010

Единственный ресурс аккаунта - красная сельдь.Ваша проблема в том, что вы пропускаете параметр :id books_url (который всегда является первым аргументом).Вы можете передать дополнительные аргументы, например, так:

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, у вас будет исходная ошибка, просто с другим параметром.

Я протестировал эти решения в примере приложенияВы отправили, и они все, кажется, работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...