我有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。
答案 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 %>