在rails模型中有条件地要求字段吗?

时间:2015-12-23 03:37:56

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

我正在为移动公司开发一个rails应用程序。我正在努力让潜在客户输入将要提交的数据。有很多非常直接的信息(姓名,电子邮件,电话等),但他们还需要输入一个目的地的原始地址,邮政编码,城市,州和国家和相同的信息。我希望状态框是一个包含州/省列表的选择框,但仅限于该国家是美国或加拿大。如果该国家不是美国或加拿大,则该框将消失/他们将无法提交值。这在轨道中是否可行,或者这更可能是我将使用jquery的东西?它是在模型,控制器或视图中实现的(它似乎是验证的模型,以及框的显示视图,但我不确定)?

我仍然对铁杆有点新意,所以如果这应该是一个简单的答案,我很抱歉。我在这款应用中使用了rails 4。

2 个答案:

答案 0 :(得分:2)

你似乎走在了正确的轨道上!隐藏/显示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节讨论了更强大的自定义验证,但我怀疑你需要走得那么远。

答案 1 :(得分:0)

要添加到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

-

  

它似乎是验证的模型,以及框的呈现视图

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

这可以相对简单地完成:

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