Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/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 RubyonRails:与参数比较验证模型数据的正确方法_Ruby On Rails_Ruby_Validation_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails RubyonRails:与参数比较验证模型数据的正确方法

Ruby on rails RubyonRails:与参数比较验证模型数据的正确方法,ruby-on-rails,ruby,validation,ruby-on-rails-4,Ruby On Rails,Ruby,Validation,Ruby On Rails 4,目前正在使用rails版本4.0.5。我似乎找不到一个规范的答案来说明这是否是最好的(DRY、MVC等)方法来验证我认为是简单的验证。在我的模型中,我有一个唯一的文档id。此document\u id应该出现在文件名中(在本例中,始终是xml文件),例如blah/blah.document\u id.xml,并且它还应该作为xml文档根元素的一个属性出现,例如id='document\u id'。我想写(假设文档id和文件名不匹配): 在app/models/document.rb中,我有以下内

目前正在使用rails版本4.0.5。我似乎找不到一个规范的答案来说明这是否是最好的(DRY、MVC等)方法来验证我认为是简单的验证。在我的模型中,我有一个唯一的
文档id
。此
document\u id
应该出现在文件名中(在本例中,始终是xml文件),例如
blah/blah.document\u id.xml
,并且它还应该作为xml文档根元素的一个属性出现,例如
id='document\u id'
。我想写(假设
文档id
文件名不匹配):

在app/models/document.rb中,我有以下内容:

class Document < ActiveRecord::Base
    ...
    def document_id_matches_filename(filename)
        return self.document_id == File.basename(filename, '.xml')
    end
end
class文档
我可以将
filename
列添加到
Document
模型中,并使用带有自定义验证器的
doc.valid
,但我不想有效地存储
Document\u id
两次。我可以找到有关向自定义验证器发送参数或创建验证类的信息,但这些信息似乎都是使用
时间之类的功能。现在
或类似的功能--动态信息,而不是与文档相关的特定信息。我可以尝试在自定义验证器中根据文档id查找xml文件,但是我的rake任务或控制器已经有了这些信息,它只需要将其交给模型进行验证。理论上,这要么是一个rake任务,要么是在控制器上,我无法想象这有多重要


提前感谢。

如何使用虚拟属性存储文件名,以便您的模型可以访问

类似于

class Document < ActiveRecord::Base
  attr_accessor :filename

  validate :document_id_matches_filename

  private

  def document_id_matches_filename
    errors.add(:document_id, 'does not match filename') unless self.document_id == File.basename(self.filename, '.xml')
  end
end
class文档

这样,您就可以使用ActiveModel的验证,获取正在查找的错误消息,并将其封装在模型中,而无需添加额外的DB列。

Perfect,这正是我所寻找的方法。我查看了很多次虚拟属性,但它从来没有点击过我,但这很完美。我的原始问题中没有添加一个小的内容,我选择这样做:
errors.add(:document_id,'not match filename'),除非self.filename.nil?或者self.document_id==File.basename(self.filename,'.xml')
通过这种方式,如果我从数据库中提取,我仍然可以使
doc.valid?
工作——假设文档在数据库中,它之前已经通过了此检查,但不会设置
self.filename
class Document < ActiveRecord::Base
    ...
    def document_id_matches_filename(filename)
        return self.document_id == File.basename(filename, '.xml')
    end
end
class Document < ActiveRecord::Base
  attr_accessor :filename

  validate :document_id_matches_filename

  private

  def document_id_matches_filename
    errors.add(:document_id, 'does not match filename') unless self.document_id == File.basename(self.filename, '.xml')
  end
end