2014-07-22 62 views
1

我在另一個模型控制器中構建模型的實例。所有似乎都正常工作,子實例很好地創建與父ID,但只要我在此資源添加驗證parent_id,該實例不再有效。任何想法我失蹤?構建嵌套資源的驗證失敗構建

使命模型:

class Mission < ActiveRecord::Base 
    has_many :planned_times 
    validates :code,   presence: true, uniqueness: { case_sensitive: false } 
    validates :days_sold, presence: true 
end 

PlannedTime型號:

class PlannedTime < ActiveRecord::Base 
    belongs_to :mission 
    validates :date,  presence: true 
    validates :mission_id, presence: true # this is the validation which causes problem 
end 

使命控制器:

class MissionsController < ApplicationController 

    def create 
    @mission = Mission.new(mission_params) 
    week_nums = params[:weeks].split(/[\s]*[,;\-:\/+][\s]*/).uniq 
    year = params[:year].to_i 
    week_nums.each do |week_num| 
     date = Date.commercial(params[:year].to_i,week_num.to_i) 
     @mission.planned_times.build(date: date) 
    end 

    if @mission.save 
     flash.now[:success] = "Mission added" 
    end 
    end 



    private 

    def mission_params 
     params.require(:mission).permit(:code, :days_sold) 
    end 
end 

回答

2

所以驗證協會的存在是有點棘手。在你的情況下,你將mission_id驗證器放在子關聯上,但是在保存mission之前,rails會在planned_time上運行驗證,因此它將失敗,因爲mission_id仍然是nil。另外,通過驗證planned_time這意味着如果您從不mission.planned_items.build驗證不會運行,因爲關聯的planned_time將不存在,因此不運行驗證。

用最少的代碼修改或驗證邏輯,你可以得到它像這樣的工作:

class PlannedTime < ActiveRecord::Base 
    belongs_to :mission 
    validates :mission_id, presence: { if: ->(p) { p.mission.nil? } } 
end 

這部分presence: { if: ->(p) { p.mission.nil? } }會檢查是否有mission對象存在(雖然沒有一個id還),如果沒有任務對象,驗證將失敗。很好,現在我們知道如果沒有其父mission對象存在,我們不能創建planned_time。但是這並沒有說明mission要求創建planned_time。如果這是你想要的,那就是解決方案。雖然我仍然想知道你是否真的想要它,你想確保一個mission總是與planned_time一起創建?

+0

好的我現在明白了。謝謝。我想創建一個有或沒有計劃時間的任務,但計劃時間應該始終有一個任務。 – Antoine