我正在尝试在我的create方法中创建2个相关模型,其中第二个模型是使用model1.model2s.build
创建的。 model*_params
只是Rails 4强参数。
所以我在create方法中有这组代码:
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
正如你所看到的那样,在方法中有一个丑陋的嵌套,并且它不是DRY,因为我被迫重复render 'new'
以捕获保存失败。这是我可以model2
保存的唯一方法,因为它需要与model1
建立关系,并且model1
必须先保存,以便model1
的ID传播到构建方法。
因此,我的问题是,我如何重构这组代码,以便它不需要嵌套的if?
答案 0 :(得分: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 :(得分: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