Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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 Rails 5-验证模型属性等于3个已定义字符串之一_Ruby On Rails_Model_Rails Activerecord_Ruby On Rails 5_Model Validation - Fatal编程技术网

Ruby on rails Rails 5-验证模型属性等于3个已定义字符串之一

Ruby on rails Rails 5-验证模型属性等于3个已定义字符串之一,ruby-on-rails,model,rails-activerecord,ruby-on-rails-5,model-validation,Ruby On Rails,Model,Rails Activerecord,Ruby On Rails 5,Model Validation,对Rails来说还是新手,所以很抱歉,我一直在网上寻找,似乎找不到有效的东西 我有一个应用程序,客人可以在其中回复活动。在创建来宾时,我将:rsvp属性默认为“waiting rsvp”。我想从我的模型验证此属性的值只能是以下值之一: 等待RSVP 出席 不出席 这是当前我的模型中的代码: class Guest < ApplicationRecord after_initialize :set_defaults validates :name, presence: true

对Rails来说还是新手,所以很抱歉,我一直在网上寻找,似乎找不到有效的东西

我有一个应用程序,客人可以在其中回复活动。在创建来宾时,我将:rsvp属性默认为“waiting rsvp”。我想从我的模型验证此属性的值只能是以下值之一:

  • 等待RSVP
  • 出席
  • 不出席
这是当前我的模型中的代码:

class Guest < ApplicationRecord
  after_initialize :set_defaults

  validates :name, presence: true
  validate :check_rsvp?

  private

  def set_defaults
    self.rsvp = "Awaiting RSVP"
  end

  def check_rsvp?
    self.rsvp == "Awaiting RSVP" || "Attending" || "Not Attending"
    # errors.add(:rsvp, "can't equal the value provided") if rsvp != "Awaiting RSVP" || "Attending" || "Not Attending"
  end
end
class-Guest
然后我做了一个测试来检查这是否正常,但是我得到了这个错误:

Guest rsvp can only equal 'Awaiting RSVP', 'Attending' or 'Not Attending'
     Failure/Error: expect(@guest).not_to be_valid
       expected #<Guest id: 1, name: "Dan", email: nil, rsvp: "aaaa", unique_code: nil, created_at: "2017-07-02 11:00:17", updated_at: "2017-07-02 11:00:17"> not to be valid
宾客rsvp只能等于“等待rsvp”、“出席”或“未出席”
失败/错误:预期(@guest)。无效
应为无效
如果我替换check\u rsvp中的代码?对于注释掉的行,上述测试通过,但所有其他测试都失败

Guest is valid
     Failure/Error: expect(@guest).to be_valid
       expected #<Guest id: nil, name: "Dan", email: nil, rsvp: "Awaiting RSVP", unique_code: nil, created_at: nil, updated_at: nil> to be valid, but got errors: Rsvp can't equal the value provided
Guest是有效的
失败/错误:期望(@guest).有效
预期#有效,但出现错误:Rsvp不能等于提供的值

我哪里做错了

我建议您使用
enum
它已经有了一些助手方法和更详细的验证


通过DB defaults设置的默认值

验证:rsvp,:inclusion=>{:in=>[“等待rsvp”,“参加”,“不参加”]
试试这个OneHanks@uzaif,太棒了。它对你有用吗?是的:)谢谢我把它标记为工作答案是的。
enum rsvp: { awaiting: 0, attending: 1, not_attending: 2 }