16

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

質問。方法:

  1. モデルをまったく使用せずに、コントローラーで Rails 検証を使用する、または

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

更新:

モデル:

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

あなたのモデルでは、メッセージのゲッターとセッターメソッドを設定するだけの以下を追加でき、データベースに列がなくてもメッセージを検証できます

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