使用模型验证表单而不使用表

时间:2016-08-30 09:45:15

标签: ruby-on-rails

如何使用没有数据库表的模型验证表单(例如联系表单)(因此不是标准记录验证)。

我试过这个,但收到错误: 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

2 个答案:

答案 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