2012-05-04 3 views
1

Я пытаюсь настроить базовую аутентификацию пользователя - у меня есть сортировка пользовательского входа и я могу добавить роли для пользователя.ruby ​​on rails rake db: seed undefined method for

По сути, я хочу, чтобы мои пользователи имели много ролей, что дает им доступ к Правам.

Я написал несколько начальных данных, но получаю сообщение об ошибке:

rake aborted! 
undefined method `roles' for #<Array:0x007f8c0581ba80> 

Мои данные Семя выглядит как:

#user 
user = User.create!([{ email: '[email protected]', first_name: 'Admin', last_name: 'Test', password: 'admin', password_confirmation: 'admin'}]) 
user.roles << admins = Role.create!(:name => "Admin") 

#user roles 
create = Right.create!(:resource => "users", :operation => "CREATE") 
read = Right.create!(:resource => "users", :operation => "READ") 
update = Right.create!(:resource => "users", :operation => "UPDATE") 
delete = Right.create!(:resource => "users", :operation => "DELETE") 

#add the roles to the admin 
admins.rights << read 
admins.rights << create 
admins.rights << update 
admins.rights << delete 

грабли БД: мигрировать отлично работает и все столбцы таблицы, как я ожидаю их к. Просто когда я запускаю rake db: seed, он прерывается с вышеуказанной ошибкой. Я понимаю, что говорит ошибка. Я просто не вижу, где я не определяю роли has_many.

Я очень внимательно изучил модели, но не могу найти то, что я пропустил.

и мои файлы модели выглядит следующим образом:

class User < ActiveRecord::Base 
    has_secure_password 

    has_many :assignments 
    has_many :roles, :through => :assignments 

    attr_accessible :email, :first_name, :last_name, :password, :password_confirmation 

    validates_presence_of :email, :on => :create 
    validates :password, :confirmation => true 
    validates :password_confirmation, :presence => true 
    validates_uniqueness_of :email 

    #will be using this later to check if the user has access to resources/actions 
    # def can?(action, resource) 
    # roles.includes(:rights).for(action, resource).any? 
    # end 
end 

class Role < ActiveRecord::Base 
    has_many :grants 
    has_many :assignments 
    has_many :users, :through => :assignments 
    has_many :rights, :through => :grants 
    scope :for, lambda{|action, resource| 
      where("rights.operation = ? AND rights.resource = ?", 
        Right::OPERATION_MAPPINGS[action], resource 
       ) 
      } 
end 

class Right < ActiveRecord::Base 
    attr_accessible :operation, :resource 
    has_many :grants 
    has_many :roles, :through => :grants 
    OPERATION_MAPPINGS = { 
     "new" => "CREATE", 
     "create" => "CREATE", 
     "edit" => "UPDATE", 
     "update" => "UPDATE", 
     "destroy" => "DELETE", 
     "show" => "READ", 
     "index" => "READ" 
    } 
end 

class Grant < ActiveRecord::Base 
    attr_accessible :right_id, :role_id 
    belongs_to :role 
    belongs_to :right 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    attr_accessible :role_id, :user_id 
end 

любая помощь будет принята с благодарностью.

ответ

2

Просто канаву [] 'с и {}' S в первой строке, например:

user = User.create!(email: '[email protected].com', first_name: 'Admin', last_name: 'Test', password: 'admin', password_confirmation: 'admin') 
+0

спасибо очень очень много :) –

4

Нельзя создавать одного пользователя в виде массива пользователей. Попробуйте удалить квадратные скобки в User.create()

user = User.create!({email: '[email protected]', first_name: 'Admin', last_name: 'Test', password: 'admin', password_confirmation: 'admin'}) 

 Смежные вопросы

  • Нет связанных вопросов^_^