我有一个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
答案 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