8

概要:カスタムバリデータ内で属性の値を変更しようとしています。ActiveModel::EachValidator次のプロトタイプがあるとします。

def validate_each(record, attribute, value)

設定しようとしてvalue = thingも何もしないようです - 何か足りないのですか? これを行うには賢い方法があるはずです...

詳細: サイトの一部として URL の入力を受け付けます。URL を取得して、それがメッセージを返すことを直接検証したくありません。これは、200 OKで始まらないエントリhttpや先頭の を省略したエントリwwwなどを無視するためです。これらのエラーに対処するためのカスタム ロジックがいくつかあり、リダイレクトに従います。したがって、ユーザーexample.org/article.ではなくhttp://www.example.org/article. ロジックは検証内で適切に機能しますが、問題は、誰かが前者を入力すると、データベースに格納された値が適切に更新されたものではなく、「間違った」形式になることです。検証中にエントリをより正規の形式に変更できますか?

4

1 に答える 1

13

それを行うには、検証をそのままにしておく必要があります。モデルの属性を操作するのに適切な場所ではありません。

ActiveModel のbefore_validationコールバックを参照してください。これは、検証の準備としてモデル属性を操作するのに適した場所です。

少なくともthis SO questionによると、コールバックについて ActiveModel 実装に伝える必要があるようです。

class YourModel
  extend ActiveModel::Callbacks
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

  before_validation :manipulate_attributes

  def manipulate_attributes
    # Your manipulation here.
  end
end
于 2012-07-30T18:19:15.083 に答える