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