web-dev-qa-db-ja.com

Railsコントローラーからの検証

名前、電話番号、電子メール、メッセージを入力できる連絡先ページがあり、その後、管理者の電子メールに送信されます。メッセージをDBに保存する理由はありません。

質問。方法:

  1. Rails検証をコントローラーで使用し、モデルをまったく使用しない、または

  2. モデルで検証を使用しますが、DB関係はありません

PD:

モデル:

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
14
Roman

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に変更します。ロガーがそのエラーを受け取ることはありません。

それが役立つことを願っています。ありがとう

10
Rails Guy

モデルを使用することをお勧めします。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
6
Marek Lipka