2013-12-21 14 views
0

我試圖在我的創建方法中創建2個相關模型,其中第二個模型使用model1.model2s.build創建。 model*_params只是Rails 4強大的參數。重構相關嵌套如果

所以我有這個設置的代碼在我的創建方法:

def create 
    @model1 = current_user.model1.build(model1_params) 

    if @model1.save 
    @model2 = @model1.model2s.build(model2_params) 

    if @model2.save 
     redirect_to model1_path(@model1) 
    else 
     render 'new' 
    end 
    else 
    render 'new' 
    end 
end 

正如你可以看到有一個醜陋的嵌套,如果在方法,我不得不重複render 'new'的秩序,這是不幹燥捕捉保存失敗。這是我可以保存model2的唯一方法,因爲它需要與model1的關係,並且model1必須先保存,以便將model1的id傳播到構建方法。

因此,我的問題是,我該如何重構這組代碼,以便它不需要嵌套if?

回答

0

您可以輕鬆地做出一個單一if/else

if @model1.save && @model1.model2s.build(model2_params).save 
    redirect_to @model1 
else 
    render 'new' 
end 

另外,異常:

begin 
    @model1 = current_user.model1.build(model1_params) 
    @model1.save! 
    @model2 = @model1.model2s.build(model2_params) 
    @model2.save! 

    redirect_to @model1 
rescue ActiveRecord::RecordInvalid => e 
    render 'new' 
end 
+0

我喜歡使用&&運算符的,可悲的是,這並沒有爲我工作。我在調試後發現的是因爲我有一個驗證來驗證關聯('model1_id')的存在,並且因爲'model2'被認爲是無效的(因爲'model1_id'在'model1之前是'nil' '保存)。理想情況下,model1和model2都不應創建,要麼是無效的。這意味着我的代碼是錯誤的,有趣的。 –

+0

然後你有更大的問題,我們不能真正解決你在這個問題上。 – meagar

+1

好點。我會接受你的答案,主要是因爲我發現它更符合Rails的做事方式,並且我將在主要問題上提出另一個問題。 –

1
def create 
    @model1 = current_user.model1.build(model1_params) 
    return render("new") unless @model1.save 
    @model2 = @model1.model2s.build(model2_params) 
    return render("new") unless @model2.save 
    redirect_to model1_path(@model1) 
end 
+1

我考慮過這樣的解決方案('render'new'並返回除非@ model1.save'),但拒絕它,因爲它不符合去除重複的'render'new''調用的要求。不過,我認爲這是我個人使用的解決方案... – meagar