Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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 Rails在嵌套的属性中传递的无效id导致';未定义的方法`属性';对于nil:NilClass';_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails Rails在嵌套的属性中传递的无效id导致';未定义的方法`属性';对于nil:NilClass';

Ruby on rails Rails在嵌套的属性中传递的无效id导致';未定义的方法`属性';对于nil:NilClass';,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在实现一个Rails应用程序,该应用程序具有以下模型: class Document < ActiveRecord::Base has_many :categorisations has_many :categories, through: :categorisations accepts_nested_attributes_for :categorisations end class Category < ActiveRecord::Base has_man

我正在实现一个Rails应用程序,该应用程序具有以下模型:

class Document < ActiveRecord::Base
  has_many :categorisations
  has_many :categories, through: :categorisations

  accepts_nested_attributes_for :categorisations
end

class Category < ActiveRecord::Base
  has_many :categorisations
  has_many :documents, through: :categorisations
end

class Categorisation < ActiveRecord::Base
  belongs_to :document
  belongs_to :category

  validates_presence_of :document
  validates_presence_of :category

  validates_uniqueness_of :category, scope: :document
end
毫不奇怪,我在尝试
document.save
时也会遇到同样的错误。在这一点上,我似乎可以通过检查类似于
document.categorizations.first.category.nil?
的内容来检测并抢占这一点。然而,在我看来,这似乎不太理想,因为它不符合Rails通常的验证实践,并且我无法遵循在
document.save
上检测无效性的常见模式(通过
false
返回值)

我是否错过了一些Rails最佳实践/更好的方式来展示我的模型,以缓解这种情况

[Edit:这里是
文档的堆栈跟踪。有效吗?
]

activerecord-4.0.2/lib/active_record/validations/uniqueness.rb:56:in `build_relation'
activerecord-4.0.2/lib/active_record/validations/uniqueness.rb:22:in `validate_each'
activemodel-4.0.2/lib/active_model/validator.rb:153:in `block in validate'
activemodel-4.0.2/lib/active_model/validator.rb:150:in `each'
activemodel-4.0.2/lib/active_model/validator.rb:150:in `validate'
activesupport-4.0.2/lib/active_support/callbacks.rb:283:in `_callback_before_29'
activesupport-4.0.2/lib/active_support/callbacks.rb:407:in `_run__1039810079386051889__validate__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations.rb:373:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `block in run_validations!'
activesupport-4.0.2/lib/active_support/callbacks.rb:373:in `_run__1039810079386051889__validation__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations.rb:314:in `valid?'
activerecord-4.0.2/lib/active_record/validations.rb:70:in `valid?'
activerecord-4.0.2/lib/active_record/autosave_association.rb:304:in `association_valid?'
activerecord-4.0.2/lib/active_record/autosave_association.rb:293:in `block in validate_collection_association'
activerecord-4.0.2/lib/active_record/autosave_association.rb:293:in `each'
activerecord-4.0.2/lib/active_record/autosave_association.rb:293:in `validate_collection_association'
activerecord-4.0.2/lib/active_record/autosave_association.rb:207:in `block in add_autosave_association_callbacks'
activerecord-4.0.2/lib/active_record/autosave_association.rb:153:in `instance_eval'
activerecord-4.0.2/lib/active_record/autosave_association.rb:153:in `block in define_non_cyclic_method'
activesupport-4.0.2/lib/active_support/callbacks.rb:397:in `_run__779968926416857275__validate__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations.rb:373:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `block in run_validations!'
activesupport-4.0.2/lib/active_support/callbacks.rb:383:in `_run__779968926416857275__validation__callbacks'
activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks'
activemodel-4.0.2/lib/active_model/validations/callbacks.rb:106:in `run_validations!'
activemodel-4.0.2/lib/active_model/validations.rb:314:in `valid?'
activerecord-4.0.2/lib/active_record/validations.rb:70:in `valid?'
[编辑2:]


我更新了问题,将
验证唯一性\u:category,scope::document
约束包含在
分类
模型中。删除该选项可以消除导致更理智的验证错误“Categorisations category不能为空”的Nil错误。但是,当验证到位时,问题仍然存在。

如果您尝试使用
关联
而不仅仅是
关联id
,我不确定验证是如何工作的,但是您可以尝试使用
验证每个
而不是
验证是否存在
,以便在
分类
模型中进行验证:

validates_each :category_id do |record, attr, value|
  unless Category.exists?(id: value)
    record.errors.add(attr, "does not exist")
  end
end

这看起来像是ActiveRecord中的一个实际错误。非常感谢您的回答。不幸的是,我的行为和以前一样。(此外,据我所知,当利用嵌套属性创建类别时,这将是一个问题)您可以添加所有堆栈跟踪吗?也许我们可以在那里找到一些东西。当然,请看编辑后的问题。我为
文档添加了堆栈跟踪。有效吗?
。在
分类
模型中是否有其他验证?出于某种原因,它试图运行
唯一性
验证。这是一个很好的观点,
分类
模型包含
验证:category,scope::document
的唯一性。我更新了原始问题,以反映这一点。此外,删除该约束可以消除Nil错误。我现在得到了一个验证错误“Categorizations category不能为空”,这显然更接近我的预期。为了简化这个问题,我似乎遗漏了一些重要的细节。我的错。谢谢你指给我看。
validates_each :category_id do |record, attr, value|
  unless Category.exists?(id: value)
    record.errors.add(attr, "does not exist")
  end
end