Rails 3:显示表单的validation错误(不保存ActiveRecord模型)
如果这是一个非常普遍和/或荒谬的问题,请道歉; 我发誓我已多次阅读文档,并且所有内容似乎都专注于ActiveRecord,以至于他们已经离开了除了创建或编辑模型数据之外的其他forms的路径。
例如,带有输入的表单可控制某些统计信息的提取和显示。 rails为validation此表单的用户输入提供了什么,不会调用save
在任何记录上? 像:
-
:email
必须是电子邮件地址 -
:num_products
必须是正整数 -
:gender
必须是“M”或“F”之一 -
:temperature
必须在-10到120之间
等等(大多数Web框架中标准的东西)……
Rails中有什么东西可以让我执行这个任意validation,还有一些查看帮助器来显示错误列表,或者是一切都与ActiveRecord相结合?
如果我在文档中忽略了这一点,请道歉,但这并没有真正涵盖它,至少就疲惫的眼睛所能说的那样。
划伤头
感谢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
例如,现在在控制器中,只需定义一个内联类:
class LoginController < ApplicationController class AuthenticationValidator "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
当逻辑更加面向控制器时,将每一组validation规则都放在自己的.rb
感觉有点不必要了。 可能有一种更简洁的方式来编写它,但我对Ruby和Rails很新。
是的,它可以很容易地完成。
您可以使用validation 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
模型上有一个有效的方法,可以触发validation。
所以改为model.save,试试model.valid?