0

ユーザー認証とアクセス許可にdeviseとcancanを使用しています。新規ユーザーのみにデフォルトの権限セットを作成する必要があります。デバイスコードを台無しにしたくないので、ユーザーモデルに含める必要があります。それを行う最善の方法は何ですか。

これが私のモデルで試したことです:

before_create :setup_permissions

    def setup_permissions 
    permissions = []
        @roles = Role.where('subject_id is null and permissions = ?', 'Read')
            @roles.each do |role|
            permissions << {:role_id => role.id}
            end
        self.role_assignments_attributes = permissions  
    end

しかし、上記のコードではエラーが発生します。

興味深いことに、コンソールで 1 行ずつアクセス許可を作成するコードを実行しました。以下に示すように、正しい配列が生成されます。

permissions =  [{:role_id=>15}, {:role_id=>17}, {:role_id=>19}, {:role_id=>21}, {:role_id=>23}, {:role_id=>25}, {:role_id=>27}]

以下に示すように、アクセス許可配列をビルドする代わりに、モデルに直接貼り付けると機能します。

def setup_permissions 
permissions =  [{:role_id=>15}, {:role_id=>17}, {:role_id=>19}, {:role_id=>21}, {:role_id=>23}, {:role_id=>25}, {:role_id=>27}]

    @roles = Role.where('subject_id is null and permissions = ?', 'Read')
        @roles.each do |role|
        permissions << {:role_id => role.id}
        end
    self.role_assignments_attributes = permissions  
   end
4

2 に答える 2

0

Model.where() の最後に .to_a を追加して配列に変換することで機能させました。Rails は、Model.find(id) の場合に Array の代わりに Model.where() 句を使用すると、ActiveRecord::Relationship を返します。これを修正し、両方のケースで同様にする必要があります。

before_create :setup_permissions
    def setup_permissions 
    permissions = []
        @roles = Role.where('subject_id is null and permissions = ?', 'Read').to_a
            @roles.each do |role|
            permissions << {:role_id => role.id}
            end         
       end
于 2012-11-28T02:19:21.940 に答える
0

after_createUser モデルにフックを追加します。

after_create :setup_permissions

def setup_permissions
  #Do what you need to do here
end
于 2012-11-27T23:34:47.393 に答える