我的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
然后它也呈现pay view
。所以永远不会显示payment view
。怎么了?我在Rails 4.0上使用Ruby 2.0。
更新:
我发现每当@cart.errors.add(:name, 'error message')
pay view
时,无论return
还是respond_to
语句如何,都会呈现{{1}}。有什么想法吗?
答案 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