Есть ли способ запуска только проверки определенного типа?Запустить все проверки За исключением любого типа «вид»: наличие
У меня есть приложение, которое обновляет несколько экземпляров класса в одной форме. Проверки выполняются путем создания экземпляра здания и проверки на этом.
Проблема: если атрибут не обновляется, поле формы остается пустым, а форма отправляет пустую строку. Здесь вы можете увидеть пример, где params [: building] [: name] - пустая строка.
params = {: building => {: name => "",: short_name => "",: code => "test"},: commit => "Update Buildings",: building_ids => [" 2 "," 5 "," 7 "],: action =>" update_multiple ",: controller =>" buildings "}
Как я могу выполнить все проверки, кроме тех, которые проверяют наличие атрибута?
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
Это метод, используемый г болеешь бежать валидации: 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