我有以下表格:
<%= 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 %>
加入到表格中。现在,真实性令牌在参数中。
因此,当提交表单时,我确实得到了一个带有"update.js"的响应。Erb"文件,控制台中显示以下内容…但是,实际上数据库中没有任何内容被更新。
嗯,是的。您的代码说,"除非属性更新成功,否则响应html和js。"由于属性没有更新,因此它呈现与请求格式对应的模板。(出于这个原因,我尽量使用if
,而不是unless
。它使代码更容易阅读和理解。)
获取更多信息的一种方法是将方法更改为update_attributes!
。这样,如果记录由于某种原因无效,该方法将引发异常,而不是简单地返回false。
作为旁注,您应该避免使用permit!
。强参数的全部意义在于,您可以有意识地决定允许哪些属性。