重构相关的嵌套if

时间:2013-12-21 09:18:53

标签: ruby-on-rails ruby

我正在尝试在我的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?

2 个答案:

答案 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