特定のタイプの検証のみを実行する方法はありますか?"kind"以外のすべての検証を実行する:
複数のクラスインスタンスを1つのフォームで更新するアプリケーションがあります。検証は、という建物を作成してという建物を作成し、検証します。
問題:属性が更新されていない場合、フォームフィールドは空白のままになり、フォームは空の文字列を送信します。ここでparams [:building] [:name]が空の文字列である例を見ることができます。 "ビルドの更新"、:building_ids => ["ビルドの更新"、 "ビルドの更新"、 "ビルドの更新" :コントローラ=>「建物」}
属性の存在をチェックするものを除くすべての検証を実行するにはどうすればよいですか?私はこれに取り組んでかなりの時間を費やし、そしてここで私がこれまでに発見したものだき
def update_multiple
@building = Building.new(params[:building].reject {|k,v| v.blank?})
respond_to do |format|
if @building.valid?
Building.update_all(params[:building].reject {|k,v| v.blank?}, {:id => params[:building_ids]})
format.html { redirect_to buildings_path, notice: 'Buildings successfully updated.' }
else
@buildings = Building.all
format.html { render action: 'edit_multiple' }
end
end
end
:
モデルを取得するには、バリデータを取得するには
$ Building.validators
=> [#<ActiveModel::Validations::PresenceValidator:0x007fbdf4d6f0b0 @attributes=[:name], @options={}>]
を検証します種類
$ Building.validators[0].kind
=> :presence
これはrで使用される方法であります検証を実行するための不振の解決策: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/callbacks.rb ライン353
# This method runs callback chain for the given kind.
# If this called first time it creates a new callback method for the kind.
# This generated method plays caching role.
#
def __run_callbacks(kind, object, &blk) #:nodoc:
name = __callback_runner_name(kind)
unless object.respond_to?(name, true)
str = object.send("_#{kind}_callbacks").compile
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
def #{name}() #{str} end
protected :#{name}
RUBY_EVAL
end
object.send(name, &blk)
end
直接の検証を実行する方法がある場合は?もしそうなら、私はBuilding.validators
を繰り返し、kind != :presence
のものだけを実行することができます。
私はあなたのアイデアを聴きたいです。
提案していただきありがとうございます。残念ながら、このようなハックが必要なように見えます。しかし、特に、複数のモデルに対して「一括編集」を許可したい場合は、面倒なコードになります。 あなたのアイデアを使って、より一般化されたソリューションを作成しました。 – nslocum