0

我的 cart_controller 中有几个动作。我在 /carts 中有 2 个视图:payment.html.erbpay.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 viewAND 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

我知道这是很久以前的事了,但对于未来的谷歌人来说!

return在块的末尾添加一个语句respond_to应该可以解决问题!

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 回答