验证不适用于扩展ActiveModel :: Naming的类,包括ActiveModel :: Validations

时间:2013-04-11 00:42:41

标签: ruby ruby-on-rails-3 rubygems activemodel

我和ruby和rails的新手;我有我在rails 3应用程序中使用的以下ruby类定义。此类仅用作我在提交(form_for)视图中填充的联系信息的属性容器。我读了一篇帖子,你可以直接使用ActiveModel而不是ActiveRecord来执行验证,所以我正在尝试它。当我检查对象是否有效时,我收到以下异常?在我的控制器上回发。我认为有效吗?因为我包含了ActiveModel :: Validations;也许我正在做一些倒退的事情。任何帮助将不胜感激:

未定义的方法`有效吗?'对于#

这是我的类定义,下面是我在控制器操作中处理它的方式:

require 'active_model'

class ContactModel
  extend ActiveModel::Naming
  include ActiveModel::AttributeMethods
  include ActiveModel::Validations
  include ActiveModel::Conversion

  validates_presence_of :first_name, :last_name, :email_address, :email_address_confirmed, :subject, :contact_message

  attr_accessor :first_name, :last_name, :email_address, :email_address_confirmed,
                :telephone_number, :subject, :contact_message

只是搞乱测试。

  validates_each :first_name, :last_name do |record, attr, value|
    record.errors.add attr, 'starts with z.' if value.to_s[0] == z
  end
...
end

在我的控制器/行动......

def send_email
    #@contact_model = ContactModel.new().initialize_copy(params[:contact_model])
    @contact_model = params[:contact_model].dup

    respond_to do |format|
      if (@contact_model.valid?)
        # Tell the UserMailer to send a welcome Email after save
        ContactMailer.contact_email(@contact_model).deliver

        format.html { redirect_to(@contact_model, notice: 'Email successfully sent.') }
        format.json { render json: @contact_model, status: :created, location: @contact_model }
      else
        # What to do here?
      end

    end
  end

1 个答案:

答案 0 :(得分:2)

在您的控制器中,您将@contact_model设置为哈希值params[:contact_model],然后在其上调用valid?。您需要创建一个ContactModel实例并在其上调用valid。像这样:

@contact_model = ContactModel.new(params[:contact_model])

if (@contact_model.valid?)
...

我看到注释掉了调用ContactModel.new()的代码,但这并不是你想要的方式。此外,没有理由在params的东西上使用dup()或initialize_copy()。