Ruby / Rails突破了嵌套方法

时间:2017-10-06 12:14:46

标签: ruby-on-rails ruby

我有一个method1根据params调用其他方法,然后返回一个json。其中一种方法检查特定用户是否存在。如果用户不存在,则该方法应呈现JavaScript警报。起初我得到一个错误,渲染被多次调用(这是正确的)。我尝试添加break但收到invalid break错误。所以我尝试return但我仍然得到了Render and/or redirect were called multiple times in this action。我在方法2中如何突破方法1,以便只调用method2中的渲染?

def method1
  data = case params["foobar"]
    when "case1"
      methodxy
    ...
    else 
      method2
    end
  render json: data
end

def method2
  if user.exists?
    return {...}
  else
    render(
      html: "<script>alert('Unknown user!')</script>".html_safe,
      layout: 'application'
    )
    return
  end
end

1 个答案:

答案 0 :(得分:2)

技术上你可以使用throw ... catch来实现这一点,它基本上就像GOTO语句一样。但我不建议这样做;代码已经太乱了,你会让问题变得更糟。

相反,您应该在method1中清理流量。使逻辑流程和响应更清晰。例如,可能是:

def method1
  if !user.exists?
     render(
      html: "<script>alert('Unknown user!')</script>".html_safe,
      layout: 'application'
    )
  else
    data = case params["foobar"]
      when "case1"
        methodxy
      ...
      else 
        method2
      end
    render json: data
  end
end

def method2
  # ...
end

然后你可以进一步重构这个,例如将user.exists?检查移动到before_filter并将case语句移动到自己的方法中,以简化操作。

最终结果可能看起来像是:

before_filter :ensure_user_exists, only: :method1

def method1
  render json: foobar_data
end