2014-04-04 57 views
2

使用rails和.js.erb发出AJAX请求(并将值附加到div),您如何防止呈现新布局?换句话说,保持在同一页没有去任何地方,只是追加从服务器的新鲜数据在一个div。没有重新加载相同的页面,没有重定向。Rails AJAX - 不重定向或渲染

目前我的控制器看起来像这样

def update_shipping 
    @order = Order.find(params[:id]) 
    @order.shipping_option_id = params[:shipping_options] 
    @order.save! 

    respond_to do |format| 
     format.js 
     format.html 
    end 
    end 

和我的格式如zisss:

 <%= form_tag update_shipping_order_path(@order), method: :put, remote: true do %> 
      <%= select_tag 'shipping_options', @options_for_select, onchange: 'this.form.submit()' %> 
     <% end %> 

和我的路线看起来像这样:

resources :orders do 
    member do 
    put :update_shipping 
    end 
end 

,但我得到'Template is Missing'错误

请帮忙!!

+2

请把你的js代码在这里 – RSB

+1

什么是你的'update_shipping.html.erb'(或.js文件)是什么样子?控制器希望在您的操作后默认呈现此文件。理想情况下,它应该只包含要返回到AJAX函数以在当前页面上呈现的'div'。 – KappaNossi

+0

$('#shipping_cell')。html('<%= j view_in_preferred_currency(@ order.shipping_option.price)%>'); @KappaNossi –

回答

0

试试这个: -

respond_to do |format| 
      format.js { render :nothing => true } 
      format.html 
     end 
+0

我以前试过这个..它会导致一个空白页面呈现 –

2

您需要添加app/views/your_controller/目录下的文件update_shipping.js.erb。请注意JavaScript文件的名称应与操作相同。由于您的表单中有remote:true,因此导轨会尝试在您的案例中呈现javascript模板update_shipping.js.erb

现在,在您update_shipping.js.erb写入文件的一些基本JavaScript来更新页面元素,比如

#update_shipping.js.erb 
$('.some-div').html(<%=j @model.some_value' %>) 
+0

我已经这样做了。谢谢 –

0

如果你不希望呈现一个布局,你可以使用!request.xhr?像这样:

respond_to do |format| 
    format.html { layout: !request.xhr? } 
    format.js 
end 

如果您想让您的ajax驱动的JS启动,您只需要拨打与您的视图相同的.js.erb文件即可:

#app/views/controller/update_shipping.js.erb 
alert("This JS is returned & fired after the Ajax request"); 

你最好在做这个你routes.rb太:

resources :orders do 
    put :update_shipping 
end