0

アプリでは、3種類の連絡先フォームがあります-モデルでは-属性:aaa, :bbb, :cccは2番目の連絡先フォームに属し、前の属性は最初の連絡先フォームに属します。

class Message

  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :body, :aaa, :bbb, :ccc

  validates :name, :email, :body, :aaa, :bbb, :ccc, :presence => true
  validates :email, :format => { :with => %r{.+@.+\..+} }, :allow_blank => true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end

end

私がやろうとしていること:それぞれの連絡フォームの属性を検証する方法、具体的には次の方法を探しています。

  • 最初の連絡フォームには次の属性が含まれています::name, :email, :body、検証する必要があります
  • 2番目の契約フォームには次の属性が含まれています::aaa, :bbb, :ccc, :emailこれを検証する必要があります

どうやってするか?どの属性がどのフォームに属しているかを区別し、それらを検証する方法は?

4

2 に答える 2

0

これについては、実装ではなく動作の観点から考えることをお勧めします。お問い合わせフォームは3つあるとおっしゃっていますが、それぞれの基本的な用途は何ですか?モデルを設定するときに、フォームについて考える必要はありません。

そうは言っても、validation_scopesgemを使用して目的を達成できます。validate_scopesを使用すると、独立して処理できる検証ルールのセットを定義できます。次に、コントローラーで、コンテキストに適用される検証ルールのセット(つまり、ユーザーが入力したフォーム)を確認できます。

モデルでは、次のように、フォームごとに名前が付けられた検証スコープを設定できます(または、より適切には、セマンティック値を持つ方法でコンテキストに名前が付けられますが、コンテキストが何であるかを知るのに十分なアプリについてはわかりません)。

validation_scope :form_one_errors do |vs|
  validates :name, :body, :presence => true
end

validation_scope :form_two_errors do |vs|
  validates :aaa, :bbb, :ccc, :presence => true
end

電子メールは両方のコンテキストで検証する必要があるため、通常の検証として設定できます(質問のコードに従って)。

次に、たとえばフォーム1のコントローラーで、スコープをチェックして、そのコンテキストにエラーがあるかどうかを確認できます。通常の検証エラーについては、検証スコープのエラーを個別にチェックする必要があることに注意してください。

if !message.valid?
  # Do something with message.errors
elsif message.has_form_one_errors?
  # Do something with message.form_one_errors
else 
  # All good
end
于 2013-01-30T22:39:41.863 に答える
0

契約書が 3 種類あるのなら、3 つのクラスに分けてはどうでしょうか。何らかの消去のために、それを 1 つのクラスに保持したい場合は、'with_options' マジックを使用してそれを行うことができます。

with_options :if => :is_form_1? do |p|
  p.validates_presence_of :attr1
  p.validates_presence_of :attr2
  p.validates_presence_of :attr3
end

with_options :if => :is_form_2? do |p|
  p.validates_presence_of :attr4
  p.validates_presence_of :attr5
  p.validates_presence_of :attr6
end

def is_form_1?
  #some logic
end

def is_form_2?
  #some logic
end

それでも、それを 1 つのクラスに留めるという考えは好きではありません。

于 2013-01-30T22:29:15.860 に答える