2012-04-23 19 views
2
class Query < ActiveRecord::Base 
    #relations 
    has_one :r_job 
    accepts_nested_attributes_for :r_job 
end 

class RJob < ActiveRecord::Base 
    belongs_to :query 
    validates_presence_of :analysis_type, :if => lambda {|job| job.query.process_r_job} 
end 

私はクエリとr_jobを作成するためにネストされたフォームを持っています。私は、クエリオブジェクト内のブール値フィールドがあり、私は上記のコードでそれをしようとしているクエリオブジェクトのブール値に基づいてr_jobのいくつかのバリデーションを行う必要がありますが、私はメソッドのエラーを取得しています。親属性に基づいて子を検証する

NoMethodError (undefined method `process_r_job' for nil:NilClass): 
    app/models/r_job.rb:3:in `block in <class:RJob>' 
    app/controllers/queries_controller.rb:9:in `create' 

Iビットに掘って、私はラムダ内部job.queryがnilオブジェクトを返して、発見しました。私はちょっとこれにこだわりました。これを解決するための助けが必要です。以下は私のフォームとコントローラのコードです。

# app/views/queries/new.html.haml 
=form_for @query, {:html => {:class=>"form-horizontal"}}do |f| 
    - if @query.errors.any? 
    .alert.alert-error 
     %h4.alert-heading Error(s)! 
     - @query.errors.full_messages.each do |msg| 
     %p= msg 

    =render "query_form", :f => f 

    %fieldset 
    =f.fields_for :r_job do |builder| 
     =render "r_job_form", :f => builder 
    %button.btn.btn-primary.small Go 

#app/controller/queries_controller.rb 
class QueriesController < ApplicationController 
    def new 
    @query = Query.new 
    @query.build_r_job 
    end 

    def create 
    @query = Query.new(params[:query]) 
    if @query.save 
     redirect_to root_path, :notice => "Yay!! Your query is running. You can download the CSV once the query finishes." 
    else 
     flash.now[:error] = "Oops, the query cannot be saved!!" 
     render :new 
    end 
    end 
end 

同様のことが行われているところで質問がありました。しかし何とか私はこの仕事を得ることができませんでした。 get parent values in child model

+0

が重複する可能性を_for子の関連付けの検証に失敗しました](http://stackoverflow.com/questions/935650/accepts-nested-attributes-for-child-association-validation-failing) –

答えて

0

:inverse_ofで行うことができます。すでに説明済み/回答済みhereです。

0

条件付きラムダは、パラメータを取らず、インスタンスのコンテキストで実行されるので、これは動作するはずです:

:if => lambda { query.process_r_job } 

と短い表記法を考えてみます。[\ _attributes \ \ _nested受け入れの

if: 'query.process_r_job' 
関連する問題