2

在我的应用程序中有一个具有管理员角色的用户模型。我希望管理员能够创建新的管理员,所以在用户/编辑页面上,我希望创建一个管理员可见的复选框,当检查将用户转换为管理员时。我正在使用的代码在这里。除了复选框位之外,一切都有效,这就是我要问的原因。我是 Rails 的新手,我只是不知道如何抓取管理复选框信息并使用它来更改管理属性(出于安全原因,它是 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

我究竟做错了什么?我提交时它不会切换任何东西。

谢谢!

萨沙

4

1 回答 1

2

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

<%= f.check_box :admin %>

它将产生具有正确名称的输入:

<input type="checkbox" id="user_admin" name="user[admin]" value="0" />

因此,您将获得正确的参数散列,该散列在表单提交后发送。

有关更多详细信息,请查看 Rails 文档:http ://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

更新#1

如果您出于安全原因想使用切换,只需更改before_saveafter_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

于 2012-09-29T04:44:31.997 回答