Rails AJAX - 不要重定向或渲染

时间:2014-04-04 08:54:30

标签: ruby-on-rails ajax ruby-on-rails-3 forms

使用rails和.js.erb发出AJAX请求(并将值附加到div),如何防止呈现新布局?换句话说,保持在同一页面,无需去任何地方,只需将服务器中的新数据附加到div中。没有重新加载同一页面,没有重定向。

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

  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

但是我收到了'模板丢失'错误

请帮助!!

4 个答案:

答案 0 :(得分:2)

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

现在在update_shipping.js.erb文件中编写一些基本的javascript来更新页面元素,如

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

答案 1 :(得分:0)

试试这个: -

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

答案 2 :(得分: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

答案 3 :(得分:0)

有点晚了,我在搜索同样的问题时遇到了这个问题。在使用动作电缆时,它一定会从我的脑海中消失,但需要的是 no_content 的 http 响应代码。 Http 响应代码告诉浏览器在返回请求时如何操作。 Here is a link to a list of them, and their symbols in railsMore on 204 no content

这是它的样子:

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

    head :no_content #or head 204
end

编辑:为我解决这个问题的是威廉丹尼斯在a link

中提供的this stack overflow question