2017-10-06 78 views
0

我有一個method1調用其他方法取決於參數,然後返回一個JSON。其中一種方法檢查是否存在特定用戶。如果用戶不存在,該方法應呈現JavaScript警報。起初,我得到了一個錯誤,渲染被稱爲多次(這是正確的)。所以我嘗試加入break,但收到invalid break錯誤。所以我嘗試return,但我仍然得到Render and/or redirect were called multiple times in this action。當我在method2中時,如何突破method1,以便只調用method2中的渲染?Ruby/Rails突破了嵌套的方法

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

無論哪種方式,都會有情況。所以,你需要在你不想渲染json數據的不同情況下添加你的'render json:data'! – hyphenbash

+0

可能的重複https://stackoverflow.com/questions/26446375/is-it-possible-in-rails-to-check-whether-a-redirect-or-render-had-already-been-i – spickermann

+0

@hyphenbash所以如果沒有渲染json,沒有辦法突破method1? – loelu

回答

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並將其移入其自己的方法來簡化事情。

最終的結果可能看起來沿着線的東西:在您調用渲染多次

before_filter :ensure_user_exists, only: :method1 

def method1 
    render json: foobar_data 
end 
+0

謝謝,我對Rails和一般編程相當陌生,我從來沒有聽說過'before_filter' – loelu