rails respond_to不会阻止代码进一步执行

时间:2013-11-01 03:36:44

标签: ruby-on-rails ruby respond-to

我的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 view然后它也呈现pay view。所以永远不会显示payment view。怎么了?我在Rails 4.0上使用Ruby 2.0。

更新:   我发现每当@cart.errors.add(:name, 'error message') pay view时,无论return还是respond_to语句如何,都会呈现{{1}}。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我知道这是很久以前的事情,但是对于未来的Google员工而言!

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

答案 1 :(得分:1)

不要简单地在当前操作中调用另一个操作,请使用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
相关问题