0

cart_controller 内にいくつかのアクションがあります。/carts: 内に 2 つのビューがpayment.html.erbあり、pay.html.erb

def pay
   success = #do something that returns true or false
   if success
     respond_to do |format|
       format.html { redirect_to '/cart/checkout/review'}
     end
   else
     render_errors
   end
end

def render_errors
  respond_to do |format|
    format.html { render 'payment'}
  end
end

私が期待しているのは

success == false

render_errors にヒットし、レンダリングしてpayment viewから停止します。ただし、それが行っていることは次のとおりですpayment view。AND THEN もレンダリングpay viewします。したがって、payment viewは表示されません。何が間違っていますか?Rails 4.0 で Ruby 2.0 を使用しています。

更新:私が行うたびに@cart.errors.add(:name, 'error message')、orステートメントpay viewに関係なくレンダリングされることがわかりました。何か案が?returnrespond_to

4

2 に答える 2

4

これはかなり前のことですが、将来の Google 社員のために!

Adding a return statement at the end of your respond_to block should do the trick!

def pay
   success = #do something that returns true or false
   if success
     respond_to do |format|
       format.html { redirect_to '/cart/checkout/review'}
     end
   else
     render_errors
   end
end

def render_errors
  respond_to do |format|
    format.html { render 'payment'}
  end and return  # here!
end
于 2015-04-07T15:38:25.433 に答える
0

現在のアクションで単純に別のアクションを呼び出すのではなく、redirect_to を使用してください。Respond_to メソッドは、「html」、「json」などの形式をレスポンダーに登録しますが、実際にはレンダリングしません。コントローラーでこれを試してください:

def pay
  success = #do something that returns true or false

  redirect_to action: 'render_errors' unless success

  respond_to do |format|
    format.html { redirect_to '/cart/checkout/review'}
  end      
end

またはこれ:

respond_to do |format|
  if success
    format.html { redirect_to '/cart/checkout/review'}
  else
    format.html { redirect_to(:action => 'render_errors') }      
  end
end
于 2013-11-01T09:12:43.413 に答える