16

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

问题。如何:

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

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

升级版:

模型:

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
4

3 回答 3

12

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. 你不会得到那个错误的记录。

希望它会有所帮助。谢谢

于 2013-07-31T08:55:19.673 回答
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
于 2013-07-31T08:52:39.090 回答
-4

在您的模型中,您可以添加以下内容,它只会为消息设置 getter 和 setter 方法,并且您可以对消息进行验证,而无需在 db 中有列

attr_accessor :message
validates :message, presence: true
于 2013-07-31T08:53:35.143 回答