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" />

したがって、フォームの送信後に送信される正しい params ハッシュが得られます。

詳細については、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

于 2012-09-29T04:44:31.997 に答える