使用Devise NoMethodError添加角色

时间:2014-06-25 02:44:17

标签: ruby-on-rails ruby devise

我在尝试使用db:seed"时遇到以下错误按照说明使用设计添加角色后,使用此tutorial

NoMethodError:未定义的方法`find_or_create_by_name'对于#...

我的用户模型如下:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :omniauthable, :omniauth_providers => [:facebook]
  #Roles an default role setup
  belongs_to :role


  before_create :set_default_role

  private
  def set_default_role
    self.role ||= Role.find_by_name('student')
  end
end

Seeds.rb

['student', 'teacher', 'moderator', 'admin'].each do |role|
  Role.find_or_create_by_name role
end

当我运行rake db:seed:

时,我在控制台中得到以下内容
rake aborted!
NoMethodError: undefined method `find_or_create_by_name' for #<Class:0x0000010137df78>
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/dynamic_matchers.rb:26:in `method_missing'
/Users/Dizzy/Documents/MM/mandarinminds/db/seeds.rb:10:in `block in <top (required)>'
/Users/Dizzy/Documents/MM/mandarinminds/db/seeds.rb:9:in `each'
/Users/Dizzy/Documents/MM/mandarinminds/db/seeds.rb:9:in `<top (required)>'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:241:in `load'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:241:in `block in load'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:232:in `load_dependency'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:241:in `load'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/railties-4.1.1/lib/rails/engine.rb:543:in `load_seed'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/tasks/database_tasks.rb:184:in `load_seed'
/Users/Dizzy/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/railties/databases.rake:173:in `block (2 levels) in <top (required)>'

任何人都可以了解一下`find_or_create_by_name&#39;遇到了这个问题?

2 个答案:

答案 0 :(得分:1)

Rails 4中不推荐使用

find_or_create_by_(attr_name)http://guides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations

您需要使用find_or_create_by和哈希参数:

Role.find_or_create_by name: role

答案 1 :(得分:1)

更好的选择将在Rails 4中:

Seeds.rb

['student', 'teacher', 'moderator', 'admin'].each do |role|
  Role.where(name: role).first_or_create
end

由于