0

レコード自体またはそのネストされた属性に対して検証を実行せずにレコードを保存できる必要があります。Rails 3.0 から抜け出せず、新しいバージョンに更新できません。

レポートがあります。各レポートには多くの応答 (質問への回答) があります。応答は、レポート フォームにネストされます。

ユーザーがレポートを保存できるようにする方法は 2 つあります。すべての検証が実行されるレビュー用に送信する方法と、レポートまたはネストされた応答に対して検証が実行されない保存して後で終了する方法です。これは、作成アクションと更新アクションの両方で機能する必要があります。

現在、条件付き検証を使用しようとしています。これは更新には機能しますが、作成には機能しません。問題は次の行です。

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
4

1 に答える 1