Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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接受嵌套属性:如果关联项为空,则拒绝_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails接受嵌套属性:如果关联项为空,则拒绝

Ruby on rails Rails接受嵌套属性:如果关联项为空,则拒绝,ruby-on-rails,ruby,Ruby On Rails,Ruby,是否有任何方法可以拒绝嵌套属性检查深层关联对象的存在?现在我正在尝试这样的事情: class Submission < ApplicationRecord has_many :answers, dependent: :destroy accepts_nested_attributes_for :answers, reject_if: :has_answer? # REJECT ANSWER IF ASSOCIATED ANSWER TYPE IS BLANK def ha

是否有任何方法可以拒绝嵌套属性检查深层关联对象的存在?现在我正在尝试这样的事情:

class Submission < ApplicationRecord
  has_many :answers, dependent: :destroy
  accepts_nested_attributes_for :answers, reject_if: :has_answer?

  # REJECT ANSWER IF ASSOCIATED ANSWER TYPE IS BLANK
  def has_answer?
    answers.each do |a|
      a.answer_open.present? || a.answer_rating.present?
    end
  end
end

class Answer < ApplicationRecord
  has_one :answer_open, dependent: :destroy
  has_one :answer_rating, dependent: :destroy

  accepts_nested_attributes_for :answer_open, reject_if: proc { |a| a['response'].blank? }
  accepts_nested_attributes_for :answer_rating, reject_if: proc { |a| a['response'].blank? }
end
类提交
答案。每个do
都应该是
自己的答案。每个do
你离得不远。根据,如果此处的
选项正确,则
拒绝\u

但是,您的
有答案吗?
方法正在检查已与提交关联的答案。您应该改为检查属性的值。在上面的链接中使用
posts\u attributes
查找示例。其中一个使用嵌套属性进行
检查时使用
拒绝\u

另外,您的
有答案吗?
方法将返回一个数组,该数组将始终为真。您可能需要以下内容:

attributes['answers_attributes'].any? do |a|
  a['answer_open'].present? || a['answer_rating'].present?
end

尽管该代码片段可能需要根据应用程序的具体情况进行调整。

请澄清,您是在询问是否拒绝基于传递属性本身中的深度嵌套对象的嵌套属性,还是基于数据库中预先存在的深度嵌套对象的嵌套属性。你是不是想“锁链”
为每个类中的
行接受_嵌套的_属性\?我想问的是拒绝基于传递属性中的深度嵌套对象的嵌套属性,正如我的示例清楚地显示的那样。知道为什么我会在上面的代码段中为nil:NilClass获得未定义的方法“Any?”吗?如果
属性
没有“答案属性”键。如果
attributes['answers\u attributes']#=>nil
,则
attributes['answers\u attributes'].any?
nil.any?
相同,不起作用。尝试在方法的开头检查
属性
,看看它是什么样子。对于这些情况,您只需添加一个检查,以查看方法开头是否存在密钥。现在,我可以根据需要使用它了,谢谢。请支持我的问题。你能提供更多的背景/信息来证实你的答案吗。