【问题标题】:Having fields be conditionally required in rails model?在rails模型中有条件地需要字段吗?
【发布时间】:2015-12-23 03:37:55
【问题描述】:

我正在为一家搬家公司开发 Rails 应用程序。我正在研究一种让潜在客户输入将要提交的数据的方法。有很多非常直接的信息(姓名、电子邮件、电话等),但他们还需要输入始发地地址、邮政编码、城市、州和国家,目的地也一样。我希望 State 框是一个包含州/省列表的选择框,但前提是该国家/地区是美国或加拿大。如果国家/地区不是美国或加拿大,则该框将消失/他们将无法提交值。这在 Rails 中是否可能,或者这更有可能是我使用 jquery 的原因?它会在模型​​、控制器还是视图中实现(看起来像是用于验证的模型,以及用于展示框的视图,但我不确定)?

我对 Rails 还是有点陌生​​,所以如果这应该是一个简单的答案,我很抱歉。我正在为这个应用程序使用 rails 4。

【问题讨论】:

  • 您可以结合使用 jQuery 和 ActiveRecord 验证来处理它。对于 jQuery,您需要一个国家/地区的侦听器,并根据选择显示/隐藏状态。在模型中,验证可以是有条件的。如果国家/地区是美国,则可能需要州的存在。

标签: jquery ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

您似乎走在正确的轨道上! states/provinces 框的隐藏/显示将由 jQuery 处理。如果国家/地区不是美国或加拿大,您还可以在模型中使用 ActiveRecord 验证来确保 state 字段为空:

class MyClass < ActiveRecord::Base
  validates :state, presence: false, unless: Proc.new { |m| m.country.in?["USA", "Canada"] }
end

反过来:

validates :state, presence: true, if: Proc.new { |m| m.country.in?["USA", "Canada"] }

您可以在RailsGuides page for Active Record Validations 了解有关自定义验证的更多信息。第 5 节讨论使用自定义方法和过程的条件验证。第 6 节讨论了更强大的自定义验证,但我怀疑你需要在这里走那么远。

【讨论】:

    【解决方案2】:

    要添加到sixty4bit 的答案(我赞成),您应该将验证放入 Rails 的后端,仅使用 JS 处理响应。


    Convention over configuration 呼吁您尽可能多地使用内置框架功能;当您开始通过 JQuery 配置验证等时,您最终会得到到处都是代码,通常会导致大量膨胀(代码重复等)。

    Rails 的验证系统非常好——您可以通过控制器发送任何一组参数,模型将根据数据是否符合验证来接受/拒绝。

    因此,我绝对建议在您的模型中添加validator;我的做法与sixty4bit 的回答(you can use strings with if/unless)略有不同:

    #app/models/model.rb
    class Model < ActiveRecord::Base
       validates :state, inclusion: { in: %w(usa canada),
        message: "%{value} is not a valid state" }, unless: "state.blank?"
    end
    

    --

    看起来像是验证的模型,以及盒子展示的视图

    除了模型验证(仅用于参数)之外,您还需要某种前端机制来处理选择框的消隐。

    这可以相对简单地完成:

    #app/assets/javascripts/application.js
    $(document).on("change", "select#state", function(e) {
        if ($(this).val() != "USA") || ($(this).val() != "Canada") {
           $(this).attr("disabled", true);
        }
    });
    

    【讨论】:

    • 感谢您的支持!对于validates :state, inclusion: { in: %w(usa canada),这是否要求state 字段为"usa""canada"?我认为 OP 不希望这些值成为状态,但如果 country 字段由 "usa""canada" 填充,则 state 字段应由实际状态填充(如 'California") ,因此如果countryin? 这两者之一,我将在state 上进行验证。
    • 是的,这可能是正确的——它比我的解释更有意义。我以为 OP 希望该州只有美国或加拿大
    猜你喜欢
    • 2011-01-10
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多