【问题标题】:rails respond_to does not stop code from executing furtherrails respond_to 不会阻止代码进一步执行
【发布时间】:2013-11-01 03:36:43
【问题描述】:

我的 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') 时,无论return 或respond_to 语句如何,都会呈现pay view。有什么想法吗?

【问题讨论】:

  • payment 是部分视图还是标准视图?
  • @trh 都是标准视图。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    不要简单地在当前动作中调用另一个动作,使用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
    

    【讨论】:

    • 我想保留我当前@cart 实例的上下文,所以我实际上不想做redirect_to,因为我会丢失所有实例值。
    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多