2009-11-20 34 views
7

我經常遇到想要一次更新很多記錄的情況 - 比如GMail設置許多消息「read」或「unread」。Rails Restful actions Index投入

Rails鼓勵這與上一個ActiveRecord類的「更新」方法 - Comment.update(鍵,值)

實施例 - http://snippets.dzone.com/posts/show/7495

這是很大的功能性,但很難映射到一個寧靜路線。從某種意義上說,我希望在集合中看到一個:put操作。在路線,我們可能會添加類似

map.resources :comments, :collection => { :update_many => :put } 

然後在形式,你可以這樣做......

<% form_for @comments do |f| %> 
    ... 

這並不在許多層面上工作。如果你這樣做::collection => {:update_many =>:put},rails會向index操作(CommentsController#index)提交一個帖子,我希望它進入'update_many'操作。相反,您可以執行:collection => {:update_many =>:post}。這至少會在控制器中執行正確的操作。對於@comments

,取而代之的<%形式......你必須做到以下幾點:

<% form_for :comments, :url => { :controller => :comments, :action => :update_many } do |f| %> 

它會工作確定這樣

還不夠完善 - 感覺有點像我們'不是'Rails的方式'。它也看起來像:post和delete:在收集控制器上也是有意義的。

我在這裏發帖,看看有沒有什麼我錯過了設置。關於如何安靜地完成集合級別的任何其他想法:post,:put,:delete?

+0

我意識到我的回答只是提供了另一種解決方案來啓發你的問題的問題。我編輯它反映了這一點。 – EmFi 2009-11-20 18:05:58

回答

1

我經常將基於集合的update_multiple和destroy_multiple動作添加到其他RESTful控制器。

檢查此Railscast通過複選框更新。它應該給你一個好主意如何接近它,如果你遇到麻煩,回來並添加到這個問題!

+0

感謝你 - 它看起來像使用'form_for'不適用於:put操作。當我切換到「form_tag」(正如Ryan B.演示的那樣)時,它現在正在進行正確的操作並正確工作。我沒有試圖找出原因。 一件小事 - 我喜歡使用'fields_for'塊爲每個記錄(f.text_field)生成輸入字段。 Ryan在他的截屏中不使用fields_for(可能是因爲它早於助手)並使用_tag方法。 'fields_for'可以在這裏使用。 – Swards 2009-11-20 17:56:47

2

我遇到了像你描述的幾種情況。我實施的前幾次幾乎與你所建議的完全一致。

大約第三次我遇到這個問題時,我意識到我正在更新的每個項目都有一個與其他項目相同的belongs_to關係。通常是一個用戶。這正是您需要用這種REST風格來理解的頓悟。它也將幫助你清理清理表單/控制器。

不要認爲它更新了一堆消息,認爲它是更新一個用戶。

以下是我過去用來突出區別的一些示例代碼。假設我們,我們希望在屬於CURRENT_USER短信羣發業務...

鐵軌2.3的,我們可以添加

accepts_nested_attributes_for :messages 

用戶模型。確保messages_attributes是attr_accessible的一部分,或者不是attr_protected。

然後創建路線:

map.resources :users, :member => {:bulk_message_update, :method => :put} 

則動作添加到控制器。隨着AJAX功能;)

def bulk_message_update 
    @user = User.find(params[:id]) 
    @user.update_attributes(params[:user]) 
    if @user.save 
    respond_to do |format| 
     format.html {redirect} 
     format.js {render :update do |page| 
      ... 
     } 
    end  
    else 
    .... 
end 

然後表單看起來就像這樣:

<% form_for current_user, bulk_message_update_user_url(current_user), 
    :html => {:method => :put} do |f| %> 
    <% f.fields_for :messages do |message| %> 
    form for each message 
    <% end %> 
    <%= sumbit_tag %> 
<% end %> 
+1

如果消息是用戶的子資源,那麼將PUT改爲/ user/123 /消息似乎是適當的。你怎麼看? – 2014-08-01 17:46:51