当你的控制器动作用json响应时,如何让action_name.js.erb重定向到另一个页面?

时间:2013-09-10 13:49:34

标签: ruby-on-rails ajax json controller

我的控制器操作perform_review正在响应json。只要有要获取的订单,perform_review.js.erb会使用新订单重新呈现视图部分,但是当我们没有要审核的订单时,perform_review.js.erb应该重定向到其他页面。

控制器如下所示:

## orders_controller.rb

class OrdersController < ApplicationController

  def perform_review

    ...

    @order = get_order

    respond_to do |format|
      format.html {
      redirect_to orders_path(current_user)
      }
      format.js {
        if @order == nil
          @redirect_path = orders_path
          return
        end
      }
    end
  end
end

这是js.erb文件:

## perform_review.js.erb

if ("<%=@redirect_path %>" != "") {
  location.href = "<%=@redirect_path %>";
}
else
  var order_options_partial = $("#order_options_partial");
  order_options_partial.children().remove();
  order_options_partial.append('<%= j render("order_options") %>');

else部分工作正常,但if部分没有。奇怪的是,控制器中的一切都很正常,@redirect_path被分配了“/ orders”。但是,在此之后看起来perform_review.js.erb似乎没有被触发。为了确保这一点,我试图添加一行console.log("Starting perform_review.js.erb");,但它不会在浏览器控制台中被调用...

1 个答案:

答案 0 :(得分:2)

您也可以在控制器中执行此操作

class OrdersController < ApplicationController

  def perform_review

    ...

    @order = get_order

    respond_to do |format|
      format.html {
      redirect_to orders_path(current_user)
      }
      format.js {render :js => "window.location.href = '"+orders_path(current_user)+"'"} if @order.blank?
    end
  end
end

通过这种方式,您perform_review.js.erb中不需要if else。 如果你想在视图文件中做,那么这是以下代码。

<% if (@order.blank?) %>
  window.location.href = "<%= escape_javascript(@redirect_path) %>";
<% else %>
  // your code
<% end %>