2012-05-30 2 views
0

Мне нужно сохранить запись без выполнения проверок на себя или вложенные атрибуты. Я застрял в 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 
+0

http://stackoverflow.com/questions/9529766/skip-validations-for-nested-attributes-in-rails-3 –

ответ

0

Не уверен, что если он будет работать с вложенными атрибутами, хотя я считаю, что надо ... но дать ValidationSkipper попробовать:

https://github.com/npearson72/validation_skipper

Просто убедитесь, что вы называете skip_validation_for на вас объект хотите пропустить. Поскольку вложенные атрибуты передают поведение своим детям, вы можете вызвать этот метод непосредственно на родительском объекте. Попробуйте.

Смежные вопросы