Rails Restful actions Index Put
我经常遇到我想要一次更新许多记录的情况 – 就像GMail设置许多消息“读取”或“未读”一样。
Rails通过ActiveRecord类的’update’方法鼓励这一点 – Comment.update(keys,values)
示例 – http://snippets.dzone.com/posts/show/7495
这是很棒的function,但很难映射到一个宁静的路线。 从某种意义上说,我希望看到:对集合采取行动。 在路线中,我们可能会添加类似的东西
map.resources :comments, :collection => { :update_many => :put }
然后在表格中,你会这样做……
...
这在许多层面都不起作用。 如果你这样做:: collection => {:update_many =>:put},rails会向索引动作(CommentsController #index)提交一个post,我希望它转到’update_many’动作。 相反,您可以执行:collection => {:update_many =>:post}。 这至少会在控制器中执行正确的操作。
并且,而不是<%form for @comments …您必须执行以下操作:
{ :controller => :comments, :action => :update_many } do |f| %>
它会以这种方式工作
仍然不完美 – 感觉有点像我们没有做’Rails方式’。 它看起来也像:post,and:delete对集合控制器也有意义。
我在这里张贴,看看是否有任何我错过了设置它。 关于如何安静地进行收集级别的任何其他想法:post,:put,:delete?
我经常将基于集合的update_multiple和destroy_multiple操作添加到其他RESTful控制器。
查看有关通过复选框更新的Railscast 。 它应该让你知道如何处理它,回过头来加入这个问题,如果你遇到麻烦!
我遇到过你所描述的一些情况。 我实施的前几次几乎与你建议的相同。
大约第三次我遇到这个问题时,我意识到我正在更新的每个项目都与其他东西有一个共同的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}
然后将操作添加到控制器。 使用AJAXfunction;)
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 %>