来自控制器的Rails验证

时间:2013-07-31 08:45:58

标签: ruby-on-rails validation model controller

有一个联系页面,提供输入姓名,电话,电子邮件和消息,然后发送给管理员的电子邮件。没有理由在DB中存储消息。

问题。如何:

  1. 在控制器中使用Rails验证,完全不使用模型,或者

  2. 在模型中使用验证,但没有任何数据库关系

  3. UPD:

    型号:

    class ContactPageMessage
    include ActiveModel::Validations
    include ActiveModel::Conversion
    extend ActiveModel::Naming
    
    attr_accessor :name, :telephone, :email, :message
    validates :name, :telephone, :email, :message, presence: true
    validates :email, email_format: { :message => "Неверный формат E-mail адреса"}
    
    def initialize(attributes = {})
        attributes.each do |name, value|
          send("#{name}=", value)
        end
    end
    
    def persisted?
      false
    end
    end
    

    控制器:

    def sendmessage
    cpm = ContactPageMessage.new()
    if cpm.valid?
        @settings = Setting.first
        if !@settings
            redirect_to contacts_path, :alert => "Fail"
        end
        if ContactPageMessage.received(params).deliver
            redirect_to contacts_path, :notice => "Success"
        else
            redirect_to contacts_path, :alert => "Fail"
        end
    else
        redirect_to contacts_path, :alert => "Fail"
    end
    end
    end
    

3 个答案:

答案 0 :(得分:10)

你应该使用模型而不继承ActiveRecord::Base类。

class ContactPageMessage

  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :whatever

  validates :whatever, :presence => true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end

end

通过这个,您将能够初始化新对象并能够在该对象上调用验证。

我认为你有一个不同的同名姓名,在你的控制器代码中,我可以看到:

if ContactPageMessage.received(params).deliver
    redirect_to contacts_path, :notice => "Success"
else

如果这是您的邮件程序类,请将其名称更改为ContactPageMessageMailer。你不会得到那个错误。

希望它会有所帮助。感谢

答案 1 :(得分:6)

我仍然建议你使用模型,rails模型不必继承ActiveRecord::Base。 例如:

class Contact
  include ActiveModel::Validations
  attr_accessor :name, :telephone, :email, :message
  validates_presence_of :name, :telephone, :email, :message
  validates_format_of :email, with: EMAIL_REGEXP
end

您可以在控制器中使用它:

contact = Contact.new
# ...
if contact.valid?
  # do something
else
  # do something else
end

答案 2 :(得分:-3)

在你的模型中你可以添加下面的内容,它只是为消息设置getter和setter方法,你可以对消息进行验证,而不需要db中的列

attr_accessor :message
validates :message, presence: true