2016-10-18 10 views
0

こんにちはを停止しない:some_controller.rbRailsはリターンをレンダリングし、私はこのような状況を持っているアプリinmy実行

私はこのAOUTコードを持っています

def start 
    method1(param) 
    .... 
    if some_case 
    render json: {ok: "ok"} 
    end 
end 

def method1 
    ... 
    if some_case 
    render json: {error: "Some error"} 
    return 
    end 
end 

それがでJSONをレンダリングする時が来たときのものがありますエラー、私はdouble renderエラーが発生します。それはrender .. and returnを使用するように私にアドバイスします。私もそれを試みたが、まだこのエラーが発生します。 renderは実行自体を中断しないので、呼び出し側メソッドにsmthを返します。そうなら、私の場合は何ができますか?実際にはmethod1というのは大きな方法であり、確かにstartメソッドから分離したいと思っています。そこにエラーを表示する理由がない場合は、startの実行を続行します。

Thanx!

+1

このコードを使用します。その後、制御は 'start'に戻り、コードの残りの部分に進みます。 2番目のレンダリングを含む。 MikDietが提案したように、beforeフィルタを使うことができます。 –

+0

@SergioTulentsevだから、私はそれについて考えました。ここで 'return'は他の言語の通常の' return'のように動作し、それ以上の実行を止めることを意味しません。ありがとう! – Ngoral

答えて

1

代わりにフィルタを使用することを検討してください。これは動作します:

before_action :method1, only: :start 
def start 
    .... 
    if some_case 
    render json: {ok: "ok"} 
    end 
end 

def method1 
    ... 
    if some_case 
    render json: {error: "Some error"} 
    return 
    end 
end 

レンダリングがフィルタで発生した場合、それ自体はアクションを実行しないため、ダブルレンダリングは発生しません。

+0

うん、それは解決策のように聞こえる。なぜフィルタについて考えなかったのかわからない。そして、よりスマートになるために:私は 'start'の途中で' method1'を呼び出す必要がある場合に、どうすれば同じ状況を守ることができますか? 0(またはこのようなthms)または 'method1'からのエラーメッセージを返し、' start'でこのレスポンスを処理しますか? – Ngoral

+0

@ Ngoral:この場合、最善の方法は 'method1'からレンダリングを抽出することです。レンダリング以外に何もしません:)ブール値を返すことができます。 trueを返した場合は、親メソッドが続行されます。 falseを返した場合、親メソッドはエラーをレンダリングして停止します –

+0

@SergioTulentsevだから、どういうわけか私は予想したようです。 Thanx again =) – Ngoral

-1

はあなた `return`のみ、それは(` method1`)でのメソッドに適用される

def method1 
    if some_case 
    render json: {error: "Some error", status: :unprocessable_entity } 
    end 
end 
+2

どのようにダブルレンダリングの問題を防ぐのでしょうか? –

関連する問題