Есть ли способ запустить только проверки определенного типа?
У меня есть приложение, которое обновляет несколько экземпляров класса в одной форме.Проверки выполняются путем создания экземпляра building и проверки на него.
Проблема: если атрибут не обновляется, поле формы остается пустым, а форма отправляет пустоестрока.Здесь вы можете увидеть пример, где params [: building] [: name] является пустой строкой.
params = {: building => {: name => "",: short_name => "",:code => "test"},: commit => "Обновить здания",: 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
Этометод, используемый rails для запуска валидаций: 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
.
Я бы хотел услышать любые ваши идеи.