Rails Restful actions Index Put

时间:2009-11-20 17:22:38

标签: ruby-on-rails forms rest

我经常遇到我想要一次更新许多记录的情况 - 就像GMail设置许多消息“读取”或“未读”一样。

Rails通过ActiveRecord类的'update'方法鼓励这一点 - Comment.update(keys,values)

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

这是很棒的功能,但很难映射到一条宁静的路线。从某种意义上说,我希望看到:对集合采取行动。在路线中,我们可能会添加类似

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

然后在表格中,你会这样做......

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

这在许多层面都不起作用。如果您这样做:: collection =&gt; {:update_many =&gt; :put},rails会向索引操作提交一个帖子(CommentsController #index),我希望它转到'update_many'动作。相反,你可以做:collection =&gt; {:update_many =&gt; :post}。这至少会在控制器中执行正确的操作。

并且,而不是&lt;%表示@comments ...您必须执行以下操作:

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

它会以这种方式运作

仍然不完美 - 感觉有点像我们没有做'Rails方式'。它看起来也像:post,and:delete对集合控制器也有意义。

我在这里张贴,看看是否有任何我错过了设置它。关于如何安静地进行收集级别的任何其他想法:post,:put,:delete?

2 个答案:

答案 0 :(得分:2)

我遇到过你所描述的一些情况。我实施的前几次几乎与你建议的相同。

关于我第三次遇到这个问题,我意识到我正在更新的每个项目与其他东西有一个共同的belongs_to关系。通常是用户。这正是你需要理解这个RESTful的顿悟。它还可以帮助您清理表单/控制器。

不要将其视为更新大量消息,将其视为更新一个用户。

这是我过去用来强调差异的一些示例代码。假设我们要对属于current_user的消息进行批量操作......

从rails 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 :(得分:1)

我经常将基于集合的update_multiple和destroy_multiple操作添加到其他RESTful控制器。

在通过复选框更新时查看此Railscast。它应该让你知道如何处理它,如果你遇到麻烦,回过头来添加这个问题!