在执行更新操作时,Rails刷新'show'部分

时间:2016-02-23 22:13:50

标签: javascript jquery ruby-on-rails

我有OrdersController show动作(order_info部分),它显示订单的当前状态(“已付款”,“已取消”等)。

同时,我有回调操作order_callback,它执行update操作并在收到来自支付处理器的回调时更改数据库中订单的状态。

我想要实现的是实时更新show操作以捕获订单状态的变化(例如订单成功支付)。

我尝试使用不引人注目的javascript,但没有成功。

update.js.erb

$("#order").html("<%= escape_javascript(render 'order_info') %>")

show.html.erb

<div id="order">
  <%= render 'order_info' %>
</div>

orders_controller.rb

  def update
    if @order.update_attributes(order_params)
      flash[:success] = "Order updated."
      redirect_to @order
    else
      render 'edit'
    end
  end

API / orders_controller.rb

def order_callback
  signature = request.headers['X-Signature']
  request_uri = URI(env['REQUEST_URI']).request_uri rescue env['REQUEST_URI']
  if $processor.callback_valid?(signature, request_uri)
    @order = Order.find(params["id"])

    @order.update_attributes(status: params["status"])

    render  status: :ok,
    json: { success: true,
            info: "Successfully updated order." }
  else
    render  status: :unprocessable_entity,
            json: { success: false }
  end 
end

我正在使用rails 4.2.2并启用了turbolink。

1 个答案:

答案 0 :(得分:0)

我能够通过javascript轮询来解决它。关键的一点是明确说明哪些.js部分在respond_to

中呈现

<强> show.js.erb

$("#order").html("<%= j render 'orders/order_info', locals: {order: @order} %>");
OrderPoller.poll();

<强> orders_controller.rb

def show
    @order = Order.find(params[:id])
    respond_to do |format|
      format.js { render "orders/show.js.erb" }
      format.html
    end

end

<强> orders.coffee

@OrderPoller =
  poll: ->
    setInterval @request, 5000
  request: ->
    $.get($('#order').data('url'))

jQuery ->
  if $('#order').length > 0
    OrderPoller.poll()

<强> show.html.erb

<%= content_tag :div, id: "order", data: { url: order_path(@order) } do %>
  <%= render 'order_info' %>
<% end %>