代码之家  ›  专栏  ›  技术社区  ›  Mark Swardstrom

Rails Restful Actions索引放置

  •  7
  • Mark Swardstrom  · 技术社区  · 16 年前

    我经常遇到这样的情况:我想一次更新许多记录,就像Gmail设置许多“已读”或“未读”的消息一样。

    Rails鼓励在ActiveRecord类上使用“update”方法-comment.update(keys,values)

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

    这是一个很好的功能,但很难映射到一个宁静的路线。从某种意义上说,我想看看A:对一个集合进行操作。在路由中,我们可以添加

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

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

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

    这在很多层面上都不起作用。如果您执行此操作:collection=>:update_many=>:put,Rails将向索引操作(CommentsController Index)提交一个日志,我希望它转到“update_many”操作。相反,您可以执行:collection=>:update_many=>:post。这至少将转到控制器中的正确操作。

    而且,@comments的表单不是<%form…您必须执行以下操作:

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

    这样行吗

    仍然不完美-感觉有点像我们没有按照“铁轨”的方式来做。它还像:post和:delete在集合控制器上也是有意义的。

    我在这里发帖是想看看我有没有遗漏什么。关于如何重新完全执行集合级别:post、:put、:delete还有其他想法吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   bensie    16 年前

    我经常添加基于集合的更新多个操作,并将多个操作销毁到另一个RESTful控制器中。

    看看这个 Railscast 通过复选框更新时。它应该给你一个好主意,如何处理它,回来,并添加到这个问题,如果你遇到麻烦!

        2
  •  2
  •   EmFi    16 年前

    我遇到了一些像你描述的情况。前几次我实现的表单几乎与您建议的表单相同。

    大约在我第三次遇到这个问题的时候,我意识到我正在更新的每一个项目都有一个共同的归属于与其他事物的关系。通常是用户。这正是你需要的顿悟,你需要好好理解这一点。它还将帮助您清理窗体/控制器。

    不要把它看成是更新一堆消息,把它看成是更新一个用户。

    下面是一些我在过去使用过的示例代码,用来突出区别。假设我们需要对属于当前用户的消息进行批量操作…

    从Rails 2.3开始,我们可以添加

     accepts_nested_attributes_for :messages
    

    到用户模型。确保消息属性是attr_可访问的一部分,或者不受attr_保护。

    然后创建路线:

     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 %>
    
    推荐文章