2017-10-06 10 views
0

私はmethod1を持っています。これはparamsに応じて他のメソッドを呼び出し、jsonを返します。これらのメソッドの1つは、特定のユーザーが存在するかどうかを確認します。ユーザーが存在しない場合、メソッドは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

いずれかの方法があるでしょう状況は、複数のレンダリング時間を呼び出します。

最終的な結果は、の線に沿って何かを見ることができます。だから、 'render json:data'をjsonデータをレンダリングしたくない別の条件で追加する必要があります! – 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それで、メソッド1から抜け出す方法はありません。 – loelu

答えて

2

技術的あなたは、本質的にGOTO文のように振る舞っているthrow ... catch、でこれを達成することができました。しかし、私はこれに助言しません。コードはすでにあまりにも厄介で、あなたは問題を悪化させています。

代わりに、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 
+0

ありがとう、私はRailsとプログラミング全般に新しく、 'before_filter'について聞いたことがありません – loelu

関連する問題