【问题标题】:rails validate depending on formrails 根据表单进行验证
【发布时间】:2014-02-04 08:36:15
【问题描述】:

我有两个单独的表格用于个人资料图片和其他个人资料信息。然而,这两种形式都对应于轮廓模型。对于几个配置文件属性,我有如下验证:

validates :title, presence: true
validates :zip_code, presence: true

问题是当有人尝试上传图片时会检查验证,这是我不想要的。话虽如此,我也有一个图像验证器,所以我不想完全避免验证,只是某些验证。我正在考虑尝试访问模型中的 params 哈希,但我无法弄清楚如何,而且我很确定这是一个坏主意。我怎样才能做出正确的验证条件?我已经试过了:

validates :title, presence: true, :unless => :picture_exists?

def picture_exists?
    if self.pic
        puts 'yo pic exist'
        return true
    else
        puts 'yo no pic'
        return false
    end
end

但它不起作用,因为它检查配置文件是否有图片,而不是参数是否有图片。因此,如果有人已经保存了一张图片,他们将能够绕过我不想要的验证。我希望在不使用图片提交表单时绕过验证。

【问题讨论】:

    标签: ruby-on-rails ruby validation model-view-controller ruby-on-rails-4


    【解决方案1】:

    您可以通过多种方式解决此问题:

    1.- 跳过控制器操作中的所有验证(我猜是手动验证)

    save(validate: false) (source)

    2.- 使用您在保存like this 之前手动设置的条件。

    3.- 使用自定义验证,如果通过,则阻止所有其他验证触发。

    也许你可以想出更多。

    PS:为什么您希望您的用户在设置个人资料图片之前绕过其他验证?

    总账和高频

    【讨论】:

    • 谢谢,3 号可以工作,但有没有办法真正做到这一点?我不确定我是否理解您的 PS 问题?
    • 我认为数字 2 更好(并且与 3 密切相关)。也许这可以阐明:stackoverflow.com/questions/8881712/…
    • @Philip7899 关于 PS 我问为什么所有其他验证都会触发错误?您的应用流程是否考虑了设置个人资料图片的用例,即使其他字段为空(或您正在验证的任何内容)?
    • 您发布的堆栈溢出问题看起来像我需要的。唯一的问题是我不能做 "new_car=Car.new(skip_method_2: true)" 因为我已经做了 @profile = Profile.new(profile_params) ,那么我怎么能通过 "skip_method: true"?
    • @Philip7899 您可以将所有想要的键附加到哈希中。我不太确定,但profile_params[:skip_method] = true 应该可以解决问题。查看 ruby​​ 哈希文档:ruby-doc.org/core-2.1.0/Hash.html
    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2021-10-06
    相关资源
    最近更新 更多