Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为关联(未定义的方法'relation_delegate_class';)截取模型常量_Ruby On Rails_Ruby On Rails 4_Rspec_Rspec3 - Fatal编程技术网

Ruby on rails 为关联(未定义的方法'relation_delegate_class';)截取模型常量

Ruby on rails 为关联(未定义的方法'relation_delegate_class';)截取模型常量,ruby-on-rails,ruby-on-rails-4,rspec,rspec3,Ruby On Rails,Ruby On Rails 4,Rspec,Rspec3,我有一个课程模型,它与权限模型关联: app/models/lesson.rb: class Lesson < ActiveRecord::Base has_many :permissions, :class_name => 'Permission', as: :permissible, dependent: :destroy ... def create_permissions Permission::DEFAULTS[:lesson].each do |ac

我有一个
课程
模型,它与
权限
模型关联:

app/models/lesson.rb

class Lesson < ActiveRecord::Base
  has_many :permissions, :class_name => 'Permission', as: :permissible, dependent: :destroy
  ...

  def create_permissions
    Permission::DEFAULTS[:lesson].each do |action, value|
      ..
    end
  end
class Permission < ActiveRecord::Base
  DEFAULTS = {
    lesson: {some_more_action: 15}
  }

  belongs_to :permissible, polymorphic: true
end
require 'rails_helper'

RSpec.describe Lesson, :type => :model do
  describe "#create_permissions" do
    let!(:lesson) { FactoryGirl.build_stubbed :lesson }

    before(:each) do
      stub_const('Permission::DEFAULTS', {lesson: {some_action: 5}})
    end

    it 'should create permissions' do
      lesson.create_permissions

      permission = lesson.permissions.first

      ...
    end
  end
end
我使用RSpec
stub\u const
方法:

spec/models/lesson\u spec.rb

class Lesson < ActiveRecord::Base
  has_many :permissions, :class_name => 'Permission', as: :permissible, dependent: :destroy
  ...

  def create_permissions
    Permission::DEFAULTS[:lesson].each do |action, value|
      ..
    end
  end
class Permission < ActiveRecord::Base
  DEFAULTS = {
    lesson: {some_more_action: 15}
  }

  belongs_to :permissible, polymorphic: true
end
require 'rails_helper'

RSpec.describe Lesson, :type => :model do
  describe "#create_permissions" do
    let!(:lesson) { FactoryGirl.build_stubbed :lesson }

    before(:each) do
      stub_const('Permission::DEFAULTS', {lesson: {some_action: 5}})
    end

    it 'should create permissions' do
      lesson.create_permissions

      permission = lesson.permissions.first

      ...
    end
  end
end
但规范失败,出现错误:

Failure/Error: permission = lesson.permissions.first
NoMethodError:
  undefined method `relation_delegate_class' for Permission:Module
 # /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/relation/delegation.rb:112:in `relation_class_for'
 # /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/relation/delegation.rb:106:in `create'
 # /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/associations/collection_association.rb:41:in `reader'
 # /home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active_record/associations/builder/association.rb:115:in `permissions'
 # ./spec/models/lesson_spec.rb:285:in `block (3 levels) in <top (required)>'
失败/错误:权限=lesson.permissions.first
命名错误:
权限:模块的未定义方法“关系\委托\类”
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/relation/delegation.rb:112:在“relation\u class\u for”中
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/relation/delegation.rb:106:在“创建”中
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/associations/collection\u association.rb:41:在“reader”中
#/home/install/.rvm/gems/ruby-2.1.4/gems/activerecord-4.2.3/lib/active\u record/associations/builder/association.rb:115:在“权限”中
#./spec/models/lesson_spec.rb:285:in'block(3层)in'
看起来,
权限
不再是与课程模型关联的rails。有没有关于如何获得这一轮的想法


Gem版本:
rspec-3.3.0
rspec-rails-3.3.3
rails-4.2.3
,我遇到的唯一选择就是在一个示例中显式设置常量:

before(:each) do
  Permission::DEFAULTS = {lesson: {some_action: 5}}
end
但我觉得这不是个好主意。它还提出了一些警告:

spec/models/lesson_spec.rb:279: warning: already initialized constant Permission::DEFAULTS
app/models/permission.rb:2: warning: previous definition of DEFAULTS was here

请仔细查看此错误消息:

NoMethodError:
  undefined method `relation_delegate_class' for Permission:Module
权限
在这里被描述为
模块
,而不是
。我认为这是因为在存根嵌套常量时,
权限
类尚未加载,RSpec也必须通过
模块
存根它

请尝试以下解决方法:

before(:each) do
  Permission # load real ActiveRecord Permission class
  stub_const('Permission::DEFAULTS', {lesson: {some_action: 5}})
end
编辑:作为旁注,我不认为将嵌套常量公开给其他类是一个好主意,您对常量几乎没有控制权(只是更改名称或值),并且您不能像使用方法那样包装任何行为。我建议使用方法将public
Permission
的API更改为,这样也更容易存根:

class Permission < ActiveRecord::Base
  DEFAULTS = {
    lesson: {some_more_action: 15}
  }

  def self.defaults
    DEFAULTS
  end    
end

很成功!有类似想法,但不知道这会导致RSpec改变行为。非常感谢。将在一个方法中结束它。