2

Rails 3.0.13、Devise、CanCan、ActiveScaffold; Ruby 1.9.3 194 on RVM (違いがある場合)

デバイス ユーザーと特定のアクセス許可の一般的な役割を設定しようとしています (役割には既定のアクセス許可が必要ですが、アクセス許可はユーザー レベルで上書きできる必要があります)。能力.rbはis_implementer?問題なくメソッドを使用できます

@userコンソールに移動し、ユーザーを var ( )に割り当ててから@user.roleorを実行すると、role または user_permissions に対してこのエラーが発生し続けます@user.user_permissions

NoMethodError: undefined method `role' for #<ActiveRecord::Relation:0x98173e8>
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/activerecord-3.0.13/lib/active_record/relation.rb:374:in `method_missing'
    from (irb):7
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/railties-3.0.13/lib/rails/commands/console.rb:44:in `start'
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/railties-3.0.13/lib/rails/commands/console.rb:8:in `start'
    from /home/scott/.rvm/gems/ruby-1.9.3-p194@rails3/gems/railties-3.0.13/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

モデル:

ユーザー クラス

class User < ActiveRecord::Base
  has_and_belongs_to_many :user_groups
  has_many :user_permissions

  belongs_to :role

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :role_id

  def is_implementer?
    self.role.implementer?
  end
end

ユーザー権限

class UserPermission < ActiveRecord::Base
  belongs_to :user
  belongs_to :permission
end

役割

class Role < ActiveRecord::Base
  has_many :default_role_permission
  has_many :users

  def implementer?
    self.name == "Implementer"
  end
end

他に見たいものがあれば教えてください (例: CanCan's capability.rb)。

4

1 に答える 1

4

これを行う@user = User.where(:id => 2)と、データがフェッチされず、ユーザーがインスタンス化されます。エラーが指摘しているように、これは ActiveRecord::Relation です。

これは、次のようなことができるためです。User.where(:active => true).limit(5)

あなたの場合、あなたができること

@user = User.where(:id => 2).first 

また

@user = User.find(2) # this is more common

@user は実際には User インスタンスであるため、#role または #user_permissions を呼び出すことができます。

于 2012-06-17T23:21:03.693 に答える