Ruby on rails 3 管理员权限的布尔复选框

Ruby on rails 3 管理员权限的布尔复选框,ruby-on-rails-3,attributes,models,Ruby On Rails 3,Attributes,Models,在我的应用程序中,有一个具有管理员角色的用户模型。我希望管理员能够创建新的管理员,因此在“用户/编辑”页面上,我希望创建一个“管理员可见”复选框,选中该复选框后,用户将变成管理员。我使用的代码在这里。除了复选框位之外,所有的东西都能工作,这就是我为什么要问的原因。我是Rails的新手,我只是不知道如何删除admin复选框信息并使用它来更改admin属性(出于安全原因,它受attr_保护) 我的编辑表格 <div class="row"> <div class="span6

在我的应用程序中,有一个具有管理员角色的用户模型。我希望管理员能够创建新的管理员,因此在“用户/编辑”页面上,我希望创建一个“管理员可见”复选框,选中该复选框后,用户将变成管理员。我使用的代码在这里。除了复选框位之外,所有的东西都能工作,这就是我为什么要问的原因。我是Rails的新手,我只是不知道如何删除admin复选框信息并使用它来更改admin属性(出于安全原因,它受attr_保护)

我的编辑表格

<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>
我做错了什么?当我提交时,它不会切换任何内容

谢谢


Sasha

实际上,问题是因为您错误地添加了:admin复选框。你必须这样做:

<%= f.check_box :admin %>
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中虚拟属性的教程:

谢谢!这绝对是正确的方向,因为我现在得到一个“不能分配质量属性”错误。但问题是,如何记录该响应,然后通过“toggle”行在user.rb文件中使用它,而不实际为表单中的属性“赋值”。有什么想法吗?为什么不想通过表单直接分配admin属性?在任何情况下:在处理\u save:toggle\u admin之前,管理员属性值已经分配,因此您要将其切换回。我不想直接分配,因为我基于Hartl的教程建立此身份验证系统,他还建议,让admin成为一个可访问的属性是一个安全缺陷,如果黑客知道他们在做什么,他们可能会改变该属性。我不太明白其中的道理,但我相信他的逻辑,我一直在努力实现一个与之相一致的解决方案。“明确定义可访问属性对于良好的站点安全至关重要。如果我们在用户模型中忽略了attr_可访问列表(或愚蠢地将:admin添加到列表中),恶意用户可以按如下方式发送PUT请求:PUT/users/17?admin=1“在这种情况下,您无需向我解释如何破坏安全性。我只是想指出为什么您的属性值没有被正确更新,因为我不知道您的体系结构是如何构建的。我已经更新了我的答案。
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
after_save :toggle_admin
attr_accessor :adminify
attr_accessible :adminify

private

    def toggle_admin
      if self.adminify == "1"
        self.toggle!(:admin)
      end
    end