2011-07-05 80 views
1

我有兩個模型:BookReadingList。 A ReadingListhas_and_belongs_to_manyBook s。在BooksController#show頁面上,我想要一個顯示所有閱讀列表的選擇列表,以及一個用於將當前書籍添加到所選閱讀列表的按鈕。Rails平靜的路線問題

大概這應該去ReadingListController#update行動,但我不能指定這是表單的URL,因爲我不知道創建表單時要發送給哪個ReadingList。我可以用JavaScript來破解它,但我寧願不依賴它。

BooksController中有一個自定義操作,它接受讀取列表ID來添加書籍,還是可以工作路線,以便請求最終進入ReadingListController#update操作?

回答

1

我建議你有一個資源,它是一個ReadingListEntry,表示一個閱讀列表中的一本書。然後,您可以簡單地POST到該資源添加它。實際上並不需要成爲模型,你可以直接操作閱讀列表。

+0

這麼多好主意,但我最終去了這個 - 感覺最有語義。乾杯安東尼和其他人:) – Skilldrick

1

顯然這是通過使用Ajax提交表單很容易實現的,但是在JavaScript被禁用/不可用的情況下,您最好的選擇是在BooksController中有一個自定義操作,將其添加到所需的閱讀清單。

您可以通過將表單指向BooksController中的操作,但具有通過Ajax發佈給ReadingList控制器的onsubmit處理程序來組合這兩者。

+0

謝謝。我不確定除了混淆之外,通過使用/不使用JS進入不同的控制器可以實現什麼功能:P然後,JS也許是更好的選擇,因爲默認的刪除鏈接只能在啓用它的情況下工作。我不知道。 – Skilldrick

1

我會創建一個自定義操作和路由,以便您可以提供book_id和list_id並形成關係。

假設你正在使用REST風格的路線

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帶或不帶阿賈克斯。

0

我想在這裏你要更改Book而不是ReadingList。因此,您應該使用新的list_id屬性放置到BooksController#更新資源。

# 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 

如果你想一本書屬於多個ReadingList你需要一個has_and_belongs_to_many關係,而不是

+0

對不起,你是對的 - 它實際上是一個'has_and_belongs_to_many'的關係。我會更新這個問題。 – Skilldrick

1

也許has_many :through關係會更好?我喜歡安東尼的一個ReadingListEntry資源的想法 - 也許把這個模型放在這個給你:

# models/book.rb 
has_many :reading_list_entries 
has_many :reading_lists, :through => :reading_list_entries 
+0

Iiiinteresting ....如果事實證明我需要任何邏輯來覆蓋連接,那麼這將是有道理的,但我認爲現在我只需要控制器。乾杯:) – Skilldrick