5

これが本当に一般的でばかげた質問である場合はお詫びします。ドキュメントを何度も読んだことを誓いますが、すべてが ActiveRecord に集中しているように見え、モデルデータの作成または編集以外のことを行うフォームの道から迷い込んでしまいました。

いくつかの統計の抽出と表示を制御するための入力を含むフォームを例にとります。このフォームのユーザー入力を検証するために、Rails は何を提供してくれますsaveか? 次のようなもの:

  • :emailメールアドレスである必要があります
  • :num_products正の整数でなければなりません
  • :gender「M」または「F」のいずれかでなければなりません
  • :temperature-10 から 120 の間でなければなりません

などなど (ほとんどの Web フレームワークに標準装備されているもの)...

この任意の検証を実行するための Rails と、エラーのリストを表示するためのビュー ヘルパーがありますか、それともすべてが ActiveRecord と結合されていますか?

ドキュメントでこれを見落としていたら申し訳ありませんが、少なくとも mt 疲れた目がわかる限り、これこれは実際にはカバーしていません。

頭を掻く

ロブの答えのおかげで、これが私が思いついたものです。ユーティリティ クラス (適切な名前のValidator) を作成しました。このクラスは、必要なすべてのもののためにコントローラーに埋め込まれています。

module MyApp

    class Validator
        include ActiveModel::Validations
        include ActiveModel::Conversion
        extend  ActiveModel::Naming

        def initialize(attributes = {})
            super
            attributes.each { |n, v| send("#{n}=", v) if respond_to?("#{n}=") }
        end
    end

end

たとえば、コントローラーで、小さなインラインクラスを定義するだけです。

class LoginController < ApplicationController
    class AuthenticationValidator < MyApp::Validator
        attr_accessor :email
        attr_accessor :password
        validates_presence_of :email, :message => "E-mail is a required field"
        validates_presence_of :password, :message => "Password cannot be blank"
    end

    def authenticate
        if request.post?
            @validator = AuthenticationValidator.new(params)
            if @validator.valid?
                # Do something meaningful
            end
        end
    end

.rbロジックがよりコントローラー指向の私見である場合、検証ルールのすべてのセットを独自に固執することは少し不必要に感じます。これをもっと簡潔に書く方法があるかもしれませんが、私は Ruby と Rails にかなり慣れていません。

4

2 に答える 2

6

はい、それはかなり簡単に行うことができます。

検証APIを使用できます。

例として、ActiveRecordを使用していないアプリケーションに使用するお問い合わせモデルを次に示します。

class ContactUs
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :subject, :message
  validates_presence_of :name, :email, :message, :subject
  validates_format_of :email, :with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\z/
  def initialize(attributes=nil)
    attributes.each do |name, value|
      send("#{name}=", value)
    end unless attributes.nil?
  end

  def persisted?
    false
  end
end
于 2011-05-02T14:14:59.047 に答える
0

モデルには、検証をトリガーする有効なメソッドがあります。

代わりにmodel.save、model.validを試してください。

于 2011-05-02T14:14:15.317 に答える