【发布时间】:2013-02-22 18:17:34
【问题描述】:
我正在尝试创建自定义表单,允许管理员打开和关闭用户的用户权限,并将它们保存到数据库中。我一定是做错了什么,因为页面生成正常,提交按钮提交给操作正常,但没有任何东西保存到数据库中,它只是再次呈现我的初始视图。谁能看到我做错了什么?
代码
路线:
resources :users do
member do
get 'assign'
put 'assign_update'
end
end
...
控制器(这种奇怪的做法是试图规避管理员和其他属性不可访问的事实。这可能是一团糟。):
...
def assign
@user = User.find(params[:id])
end
def assign_update
admin_protected = params[:user].delete(:admin)
@user = User.find(params[:id])
@user.admin = admin_protected
if @user.save
flash[:success] = "User updated"
redirect_to users_path
else
render 'assign'
end
end
查看:
...
<%= form_for(@user, url: { controller: 'users',
action: 'assign_update'}, method: 'put') do |f| %>
<%= f.label :admin, 'Is admin?', class: 'checkbox inline' %>
<%= f.check_box :admin %>
<%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
【问题讨论】:
-
当你说“它只是再次渲染我的初始视图”时,你的意思是它渲染了分配视图吗?
-
它显示了分配视图的内容,是的,我假设这是
render 'assign'的结果,因为它不保存。 url 更改为 assign_update,如果我取消选中该框,它将保持未选中状态,但是通过控制台检查数据库时,admin 属性未更改。 -
它确实将它从 params 哈希中删除,但它也将它分配给变量
admin_protected,之后无论如何它都没有用了。当我尝试以稍微不同的方式进行操作时,这有点剩余。即使我改变它也不起作用。无论哪种方式,变量仍然被赋予相同的值。 -
您是否对用户模型有任何验证?我认为对其他用户属性的验证可能会阻止用户实例被更新。要检查这一点,请使用
save!而不是save。 -
哦等等,我想你可能想试试
update_attribute方法。 It seems to skip model validation and mass assignment protection which is exactly what you need.
标签: ruby-on-rails ruby-on-rails-3 rails-activerecord