Rails проблема спокойных маршрутов - PullRequest
1 голос
/ 05 июля 2011

У меня есть две модели: Book и ReadingList.A ReadingList has_and_belongs_to_many Book с.На странице BooksController#show я хотел бы иметь список выбора, который отображает все списки чтения, с кнопкой для добавления текущей книги в выбранный список чтения.

Предположительно, это должно перейти к ReadingListController#update action, но я не могу указать это в качестве URL-адреса формы, потому что я не буду знать, на какой ReadingList отправлять данные во время создания формы.Я мог бы взломать его с помощью JavaScript, но я бы предпочел не полагаться на это.

Было бы лучше иметь настраиваемое действие в BooksController, которое принимает идентификатор списка чтения для добавления книги, илия могу обработать маршруты так, чтобы этот запрос заканчивал тем, что достигал действия ReadingListController#update?

Ответы [ 5 ]

1 голос
/ 05 июля 2011

Возможно, отношения has_many :through будут лучше? Мне нравится идея Энтони о ресурсе ReadingListEntry - возможно, за этим стоит модель:

# models/book.rb
has_many :reading_list_entries
has_many :reading_lists, :through => :reading_list_entries
1 голос
/ 05 июля 2011

Я полагаю, что у вас есть ресурс, который представляет собой ReadingListEntry, представляющий книгу в списке чтения.Затем вы можете просто POST к этому ресурсу, чтобы добавить его.За этим на самом деле не нужно модели, вы можете напрямую управлять списком чтения.

1 голос
/ 05 июля 2011

Я бы создал собственное действие и маршрут, чтобы вы могли предоставить book_id и list_id и сформировать отношение.

Предполагается, что вы используете спокойные маршруты

resources :books do 
  post '/lists/:list_id/subscribe' => 'lists#subscribe', :as => :subscribe
end

def subscribe 
  @list = List.find params[:list_id]
  @book = Book.find params[:book_id]
  @list << @book
end

Теперь вы можете использовать button_to с или без ajax.

1 голос
/ 05 июля 2011

Очевидно, что это то, чего легко достичь с помощью Ajax для отправки формы, но в случае, если JavaScript отключен / недоступен, лучше всего иметь настраиваемое действие в BooksController, которое добавляет его к требуемому чтениюlist.

Вы можете объединить оба, имея форму, указывающую на действие в BooksController, но имея обработчик onsubmit, который отправляет сообщения в контроллер ReadingList через Ajax.

0 голосов
/ 05 июля 2011

Я думаю, что здесь вы меняете Book, а не ReadingList.Поэтому вы должны PUT к ресурсу обновления BooksController # с новым атрибутом list_id.

# in views/books/show.html.erb
<%= form_for @book, :url => book_path(@book) do |f| =>
  <%= f.select :list, ReadingList.all.map { |l| [l.name, l.id] } =>
  <%= submit_tag "Change" =>
<% end %>

# in controllers/books_controller.rb
# params[:book][:list_id] => 123
def update
  @book = Book.find(params[:id])
  @book.update_attributes(params[:book])
end

# config/routes.rb
resources :books
resources :lists do
  resources :books
end

Если вы хотите, чтобы Book принадлежала более чем одному списку ReadingList, вам понадобится отношение has_and_belongs_to_many

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