【问题标题】:Addings roles with Devise NoMethodError使用 Devise NoMethodError 添加角色
【发布时间】:2014-08-15 11:16:03
【问题描述】:

在按照说明使用设计添加角色后尝试“rake 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

种子.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' 是如何遇到这个问题的?

【问题讨论】:

    标签: ruby-on-rails ruby devise


    【解决方案1】:

    更好的选择是在 Rails 4 中:

    种子.rb

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

    谢谢

    【讨论】:

      【解决方案2】:

      find_or_create_by_(attr_name) 在 Rails 4 中已弃用。http://guides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations

      您需要使用find_or_create_by 和一个哈希参数来代替:

      Role.find_or_create_by name: role
      

      【讨论】:

        猜你喜欢
        • 2013-01-02
        • 2014-05-28
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多