0

それぞれ異なる検証を持つ合計 7 つのモデルを含むネストされたフォームを使用しています。フォームを単純に編集すると、検証が実行されて正常に表示され、データが適切に保存されます。ただし、フォームの送信者に応じて異なる検証を実行する必要があります (つまり、管理者は必須フィールドをスキップできます)。

モデルで attr_accessible :editing_user を使用して特定の検証をスキップできると考え、これをコントローラー内で設定しました。

class ModelExample < ActiveRecord::Base
  attr_accessible :editing_user
  validates_presence_of :email, :unless => "editing_user == 'admin'"
end

class ModelExamplesController < ActionController::Base
  def create
    @model_example = ModelExample.new(params[:model_example])
    @model_example.editing_user = 'admin'
    @model_example.save
  end
end

ネストされたモデル内でこの基本構造を使用し、適切に保存できるかどうかを確認しました。ここから奇妙な行動が始まります。何らかの理由で、ActiveRecord がネストされたモデルを複数回保存しようとして、そのたびに検証を実行しているようです。これを奇妙にしているのは、@model_example.save を呼び出していることです。これは、失敗した場合に false を返すだけです。ただし、最初の検証は (editing_user が設定されているため) 通過しますが、その後の検証は失敗して例外が発生するため、通常の .save メソッドは戻る代わりに例外を発生させてしまいます。

ActiveRecord がすべての追加の検証と保存を行わないようにする方法、またはこれらの重複するアクション全体で edit_user を保持する方法を知っている人はいますか?

4

1 に答える 1

1

ハ!とにかく、ほとんど同じユースケースです(ユーザーを主張してください)。これが私がそれを解決した方法です(私がコピーした私の仲間のJason Dewにすべての功績があります):

class User < ActiveRecord::Base

  module ClassMethods
    attr_accessor :current
  end

  extend ClassMethods
end

このコード ブロックは、シングルトン アクセサー :current を User クラス メソッドに追加し、User.current として呼び出すことができます。メソッドが呼び出された方が見栄えが良いself.currrent

次に、アプリコントローラーで

before_filter :require_user #=> which in this case goes off and sets the current_user var
before_filter {|c| User.current = current_user}

アプリ コントローラーをブロックに渡し、User.current 変数を設定します。

次に、他のモデルで

class MyClass < ActiveRecord::Base
  def log
    "This was done by #{User.current}"
  end
end
于 2010-08-05T16:55:17.410 に答える