Единственный ресурс аккаунта - красная сельдь.Ваша проблема в том, что вы пропускаете параметр :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, у вас будет исходная ошибка, просто с другим параметром.
Я протестировал эти решения в примере приложенияВы отправили, и они все, кажется, работают.