d11*_*wtq 5 ruby forms validation ruby-on-rails activemodel
如果这是一个非常普遍和/或荒谬的问题,请道歉; 我发誓我已多次阅读文档,并且所有内容似乎都专注于ActiveRecord,以至于他们已经离开了除了创建或编辑模型数据之外的其他形式的路径.
例如,带有输入的表单可控制某些统计信息的提取和显示.rails为验证此表单的用户输入提供了什么,不会save在任何记录上调用?像:
:email 必须是电子邮件地址:num_products 必须是正整数:gender 必须是"M"或"F"之一:temperature 必须在-10到120之间等等(大多数Web框架标准的东西)......
Rails中有什么东西可以让我执行这个任意验证,还有一些查看辅助工具来显示错误列表,还是一切都与ActiveRecord相结合?
道歉,如果我的文档中忽略了这一点,但是这个和这个没有真正覆盖它,至少至于MT疲惫的眼睛可以告诉.
划痕头
感谢Rob的回答,这就是我想出的.我创建了一个实用程序类(恰当地命名Validator),它只是嵌入到我的控制器中,用于任何需要它的东西.
module MyApp
class Validator
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
def initialize(attributes = {})
super
attributes.each { |n, v| send("#{n}=", v) if respond_to?("#{n}=") }
end
end
end
Run Code Online (Sandbox Code Playgroud)
例如,现在在控制器中,只需定义一个内联类:
class LoginController < ApplicationController
class AuthenticationValidator < MyApp::Validator
attr_accessor :email
attr_accessor :password
validates_presence_of :email, :message => "E-mail is a required field"
validates_presence_of :password, :message => "Password cannot be blank"
end
def authenticate
if request.post?
@validator = AuthenticationValidator.new(params)
if @validator.valid?
# Do something meaningful
end
end
end
Run Code Online (Sandbox Code Playgroud)
.rb当逻辑更加面向控制器恕我直言时,将每一组验证规则都放在自己的位置感觉有点不必要.可能有一种更简洁的方式来编写它,但我对Ruby和Rails很陌生.
是的,它可以很容易地完成.
您可以使用验证 API.
例如,这是一个联系我们模型,我用于不使用ActiveRecord的应用程序.
class ContactUs
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :name, :email, :subject, :message
validates_presence_of :name, :email, :message, :subject
validates_format_of :email, :with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\z/
def initialize(attributes=nil)
attributes.each do |name, value|
send("#{name}=", value)
end unless attributes.nil?
end
def persisted?
false
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |