Проверка правильности 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