【发布时间】:2014-12-03 22:33:46
【问题描述】:
基本上,我有一个模型,Degree,它具有三个属性:degree_type、awarded_by 和 date_awarded。
有两个值数组应该对awarded_by 有效。 degree_type 的两个有效值是"one" 和"two",awarded_by 的有效值取决于"one" 和"two"。
如果degree_type 是"one"(具有"one" 的值,用户将输入),我希望awarded_by 的有效值是array_one。如果degree_type 的值为"two",我希望awarded_by 的有效值为array_two。
这是目前为止的代码:
class Degree < ActiveRecord::Base
extend School
validates :degree_type, presence: true,
inclusion: { in: ["one",
"two"],
message: "is not a valid degree type"
}
validates :awarded_by, presence: true,
inclusion: { in: Degree.schools(awarded_by_type) }
end
Degree.schools 根据度数类型输出一个数组,因此Degree.schools("one") 将返回array_one,其中
array_one = ['school01', 'school02'...]
我的问题是,我不知道如何在模型中访问degree_type 的值。
我在下面尝试的方法不起作用:
validates :awarded_by, presence: true,
inclusion: { in: Degree.schools(:degree_type) }
我尝试使用before_type_cast,但要么使用不正确,要么出现其他问题,因为我也无法让它工作。
当我测试这个时,我得到:
An object with the method #include? or a proc, lambda or symbol is required, and must be supplied as the :in (or :within) option of the configuration hash
帮帮我? :) 如果需要更多信息,请告诉我。
编辑:此外,我仔细检查了这不是我的 Degree.schools 方法起作用 - 如果我进入 rails 控制台并尝试 Degree.schools("one") 或 Degree.schools("two") 我确实得到了我应该得到的数组。 :)
再次编辑:当我尝试@Jordan 的回答时,在 awarded_by 不正确的情况下出现错误,因为在这些情况下,valid_awarded_by_values 是 nil 并且没有用于 nil 对象的 include? 方法.因此我添加了一个 if 语句来检查 valid_awarded_by_values 是否为 nil(如果是 return),这就解决了问题!
我把它放在方法中,在 unless 语句之前和 valid_awarded_by_values 声明之后:
if valid_awarded_by_values.nil?
error_msg = "is not a valid awarded_by"
errors.add(:awarded_by, error_msg)
return
end
【问题讨论】:
标签: ruby-on-rails validation models