如何使用没有数据库表的模型验证表单(例如联系表单)(因此不是标准记录验证)。
我试过这个,但收到错误:
undefined method
有效吗?'联系方式:Class`
class Contact
include ActiveModel::Validations
attr_accessor :subject, :query
validates :subject, { :presence => { message:'Please select a subject' } }
validates :query, { :presence => { message:'Please enter your message' } }
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end
然后是方法:
def contact
@page_title = 'Contact Us'
end
def contact_email
if Contact.valid?
message = "#{params[:subject]}: #{params[:query]}"
current_user.send_contact_message(message)
redirect_to '/contact', notice: 'Thank you for your message, we will be in touch shortly.'
else
render :contact
end
end
答案 0 :(得分:1)
valid?
是一种实例方法。您只能在类的实例上调用它而不能在类上调用它。您需要更改此行
if Contact.valid?
到这个
contact = Contact.new(subject: 'some subject', query: 'some query')
if contact.valid?
希望有所帮助!
答案 1 :(得分:0)
Rails 4的一个新功能是ActiveModel::Model
,这使得创建无表格模型变得非常容易。它为您提供验证,通过I18n模块进行翻译,表单绑定,多态路由等。除了持久性之外,几乎所有ActiveRecord::Base
都可以。
class Contact < ActiveModel::Model
attr_accessor :subject, :query
validates :subject, presence: { message:'Please select a subject' }
validates :query, presence: { message:'Please enter your message' }
end
除此之外,您的错误是由于您在Contact类上调用.valid?
而不是实例。
轨道方式是:
# config/routes.rb
resources :contacts, only: [:new, :create]
# app/controllers/contacts_controller.rb
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(contact_params)
if @contact.valid?
message = "#{params[:subject]}: #{params[:query]}"
current_user.send_contact_message(message)
redirect_to '/contact', notice: 'Thank you for your message, we will be in touch shortly.'
else
render :new
end
end
private
def contact_params
params.require(:contact).permit(:foo, :bar)
end
end