在我的应用中,有一个具有管理员角色的用户模型。我希望管理员能够创建新的管理员,因此在用户/编辑页面上,我希望创建一个admin-visible复选框,当选中该复选框时,将用户转变为管理员。我正在使用的代码就在这里。除了复选框之外,一切都有效,这就是我要问的原因。我是Rails的新手,我无法弄清楚如何抓取admin复选框信息并使用它来更改admin属性(出于安全原因,这是attr_protected)。
我的编辑表单
<div class="row">
<div class="span6 offset3">
<%= form_for(@user) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation %>
<% if signed_in? %>
<% if current_user.admin? %>
<h3> Click to Switch On/Off Admin
<%= check_box_tag(:admin) %></h3>
<% end %>
<% end %>
<%= f.submit @string, class: "btn btn-large btn-primary" %>
<% end %>
</div>
</div>
我的user.rb文件的相关行
before_save :toggle_admin
private
def toggle_admin
if self.admin == true
self.toggle!(:admin)
end
end
我做错了什么?我提交时不会切换任何内容。
谢谢!
萨莎
答案 0 :(得分:2)
实际上问题是因为您错误地添加了:admin复选框。你必须这样做:
<%= f.check_box :admin %>
它将生成具有正确名称的输入:
<input type="checkbox" id="user_admin" name="user[admin]" value="0" />
那么你将拥有正确的params hash,它是在表单提交后发送的。
有关其他详细信息,请查看Rails文档:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box
更新#1
如果您出于安全原因需要使用切换功能,请将before_save
更改为after_save
,因为切换的工作原理如下:
User.last.toggle!(:admin)
SQL输出:
1.9.3p194 :007 > User.last.toggle!(:admin)
User Load (0.6ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
SQL (83.8ms) UPDATE `users` SET `admin` = 1 WHERE `users`.`id` = 13
=> true
1.9.3p194 :008 > User.last.toggle!(:admin)
User Load (0.6ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
SQL (76.7ms) UPDATE `users` SET `admin` = 0 WHERE `users`.`id` = 13
更新#2
原则上,您可以使用复选框的虚拟属性来实现它。
after_save :toggle_admin
attr_accessor :adminify
attr_accessible :adminify
private
def toggle_admin
if self.adminify == "1"
self.toggle!(:admin)
end
end
在Rails中查看有关虚拟属性的教程:http://railscasts.com/episodes/167-more-on-virtual-attributes