Мне нужно сохранить запись без выполнения проверок на себя или вложенные атрибуты. Я застрял в Rails 3.0, и я не могу обновиться до более новой версии.Rails 3.0 Пропустить проверки для вложенных атрибутов
У меня есть отчет, в каждом отчете есть много ответов (ответы на вопросы). Ответы вложены в форму отчета.
У пользователя есть возможность сохранить отчет: Отправить для проверки, где все проверки выполняются, и Сохранить и закончить позже, где не выполняется проверка для отчета или вложенных ответов. Это необходимо для работы как для создания, так и для обновления.
В настоящее время я пытаюсь использовать условные проверки. Это работает для обновления, но не для создания. Проблема заключается в этой строке:
validate :has_answer_if_required, :if => Proc.new { |response| !response.report.finish_later? }
Отчет еще не существует, поэтому активная запись не может найти отчет откликов. Вот где он падает.
Есть много предлагаемых решений для этой проблемы, но я не мог заставить их работать в Rails 3.0. update_attributes (attributes,: validate => false), например, недоступен в Rails 3.0.
Итак, как пропустить проверки в вложенных атрибутах?
class Report < ActiveRecord::Base
has_many :responses, :order => "created_at asc", :autosave => true
accepts_nested_attributes_for :responses
...
end
class Response < ActiveRecord::Base
belongs_to :report
validates_associated :report
validate :has_answer_if_required, :if => Proc.new { |response| !response.report.finish_later? }
validate :correct_answer_or_comment, :if => Proc.new { |response| !response.report.finish_later? }
end
class ReportsController < BaseController
def update
@report = Report.find(params[:id])
@report.attributes = params[:report]
if params[:finish_later].nil?
@report.update_attribute(:finish_later, false)
if @report.save!
redirect_to :action => :index
else
render :template => "reports/edit"
end
else
@report.finish_later = true
@report.save(:validate => false)
redirect_to :action => :index
end
end
def create
@report = Report.new(params[:report])
if params[:finish_later].nil?
@report.finish_later = false
if @report.save!
redirect_to :action => :index
else
render :template => "reports/edit"
end
else
@report.finish_later = true
@report.save!(:validate => false)
redirect_to :action => :index
end
end
end
http://stackoverflow.com/questions/9529766/skip-validations-for-nested-attributes-in-rails-3 –