2013-12-21 71 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