Rails 4 - update_attributes不更新

时间:2014-07-07 23:22:56

标签: ruby-on-rails-4 update-attributes

我有以下表格:

<%= form_for @user, :html => {:class => 'edit-form' }, :url => {:action => 'add_group', :id => @user.id }, :remote => true do |f| %>
  <%= f.select :group_ids, Group.all.collect {|x| [x.name, x.id]}, {}, :class => 'multiselect', :multiple => true %>
  <button type="submit" id="submit_it" class="btn btn-primary">Submit</button>
<% end %>

在我的控制器中:

 def add_group 
    @user = User.find(params[:id])
    unless @user.update_attributes(option_params)
        respond_to do |format|
            format.html
            format.js
        end
     end
end

def option_params
     params.require(:user).permit!
end 

因此,当提交表单时,我使用我的“update.js.erb”文件获得响应,并且以下内容显示在控制台中:

Started PATCH "/user_management/add_group?id=41" for 123.45.67.89 at 2014-07-07 22:58:38 +0000
 Processing by UserController#update as JS
 Parameters: {"utf8"=>"✓", "user"=>{"group_ids"=>["", "3", "4"]}, "multiselect"=>"4", "id"=>"add_group"}
 Rendered user/update.js.erb (0.1ms)
 Completed 200 OK in 13ms (Views: 11.9ms | ActiveRecord: 0.0ms)

但是,数据库中实际上没有更新任何内容。

我的模型中没有任何验证会导致不更新。

我的模特关系是这样的:

  class User < ActiveRecord::Base
    has_many :group_assignments
    has_many :groups, through: :group_assignments
  end

  class Group < ActiveRecord::Base
    has_many :group_assignments
    has_many :users, through: :group_assignments
  end

  class GroupAssignment < ActiveRecord::Base
    belongs_to :group 
    belongs_to :user
  end

关于为什么不更新的任何想法?

更新

我认为这可能是因为表单是通过AJAX加载的,并且没有CSRF标记。所以我在表单中添加了<%= hidden_field_tag :authenticity_token, form_authenticity_token %>。现在,真实性令牌在params中。

1 个答案:

答案 0 :(得分:2)

  

因此,当提交表单时,我确实得到了我的“update.js.erb”文件的响应,并且以下内容显示在控制台中......但是,实际上没有任何内容在数据库中得到更新。 / p>

嗯,是的。您的代码说,“除非属性成功更新,否则请回复html和js。”由于属性未进行更新,因此它会呈现与请求格式对应的模板。 (出于这个原因,我尝试尽可能使用if,而不是unless。它使代码更易于阅读和理解。)

您可以使用一种方法来获取更多信息,方法是将方法更改为update_attributes!。这将使得它不会简单地返回false,如果记录由于某种原因无效,该方法将引发异常。

作为旁注,您应该避免使用permit!。强参数的重点在于您有意识地决定允许哪些属性。