Проверка правильности Rails от контроллера

Существует контактная страница, в которой предлагается ввести имя, телефон, адрес электронной почты и сообщение, после чего оно отправляется по электронной почте администратора. Нет причин хранить сообщения в БД.

Вопрос. Как сделать:

  • Использовать проверки Rails в контроллере, не используя модель вообще, OR

  • Использовать проверки в модели, но без каких-либо отношений DB

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 [email protected]
        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

Ответ 1

вы должны использовать модель без наследования класса 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. вы не получите эту ошибку.

Надеюсь, это поможет. Благодаря

Ответ 2

Я бы по-прежнему советовал вам использовать модель, модели рельсов не должны наследовать от 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

Ответ 3

В вашей модели вы можете добавить нижеследующее, которое просто установит метод getter и setter для сообщения, и вы можете получить подтверждение на сообщение без столбца в db

attr_accessor :message
validates :message, presence: true