管理员权限的复选框布尔值

时间:2012-09-29 03:42:10

标签: ruby-on-rails-3 attributes models

在我的应用中,有一个具有管理员角色的用户模型。我希望管理员能够创建新的管理员,因此在用户/编辑页面上,我希望创建一个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

我做错了什么?我提交时不会切换任何内容。

谢谢!

萨莎

1 个答案:

答案 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