ruby-on-rails - Rails Restful 操作索引放置

标签 ruby-on-rails forms rest

我经常遇到我想一次更新许多记录的情况 - 就像 GMail 将许多邮件设置为“已读”或“未读”一样。

Rails 鼓励使用 ActiveRecord 类上的“更新”方法 - Comment.update(keys, values)

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

这是很棒的功能,但很难映射到 Restful 路线。从某种意义上说,我希望看到 :put 对集合的操作。在路由中,我们可能会添加类似

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

然后在表格中,你会这样做......
<% form_for @comments do |f| %>
  ...

这在很多层面上都不起作用。如果你这样做: :collection => { :update_many => :put },rails 将提交一个帖子到 index Action (CommentsController#index),我希望它转到 'update_many' Action 。相反,您可以执行 :collection => { :update_many => :post }。这至少会在 Controller 中执行正确的操作。

并且,而不是@comments 的 <% 表单......你必须执行以下操作:
<% form_for :comments, :url => { :controller => :comments, :action => :update_many } do |f| %>

这样就可以正常工作

仍然不完美 - 感觉有点像我们没有按照“Rails 方式”来做。似乎 :post 和 :delete 在集合 Controller 上也有意义。

我在这里发帖是为了看看我是否在设置时遗漏了什么。关于如何安静地执行集合级别的任何其他想法:post,:put,:delete?

最佳答案

我遇到过你描述的几种情况。前几次我实现的形式与您建议的几乎相同。

大约第三次遇到这个问题时,我意识到我正在更新的每个项目都与其他项目有一个共同的belongs_to 关系。通常是用户。这正是您需要以 RESTful 方式理解这一点的顿悟。它还将帮助您清理表单/ Controller 。

不要将其视为更新一堆消息,而是将其视为更新一个用户。

这是我过去使用的一些示例代码来突出显示差异。假设我们想要对属于 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}

然后将 Action 添加到 Controller 。具有 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 %>

关于ruby-on-rails - Rails Restful 操作索引放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772011/

相关文章:

ruby-on-rails - 将选项传递给 ActiveModelSerializers 0.9.0

ruby-on-rails - 获取 Devise 身份验证以发送电子邮件以检索密码

mysql - Rails 4 - 按相关模型排序 created_at - 事件

html - 预填充 HTML 表单文件输入

Android 客户端和 PHP 服务器 : common practice in communication

ruby-on-rails - 新的 Rails 项目——Rails2 还是 Rails3?

PHP插入\到sql表

forms - Drupal,在一个页面中创建多个CCK输入表单

json - 带有证书的快速 REST 请求返回错误(代码 -999)

rest - 高级 REST 客户端 : adding query parameters