【问题标题】:Rails AJAX - don't redirect or renderRails AJAX - 不要重定向或渲染
【发布时间】:2014-04-04 08:54:29
【问题描述】:

使用 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

但我收到“模板缺失”错误

请帮忙!!

【问题讨论】:

  • 请把你的js代码贴在这里
  • 您的update_shipping.html.erb(或.js)是什么样的?控制器希望在您执行操作后默认呈现此文件。理想情况下,它应该只包含您想要返回到 AJAX 函数以在当前页面上呈现的div
  • $('#shipping_cell').html(''); @KappaNossi

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个:-

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

    【讨论】:

    • 我以前试过这个。它会导致一个空白页面呈现
    【解决方案3】:

    如果你不想渲染一个布局,你可以像这样使用!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
    

    【讨论】:

      【解决方案4】:

      有点晚了,我在寻找同样的问题时遇到了这个问题。在使用动作电缆时,它一定会从我的脑海中溜走,但需要的是 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
      

      编辑:为我解决解决方案的是威廉丹尼斯在this stack overflow question 中提供的a link

      【讨论】:

        猜你喜欢
        • 2015-07-04
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        相关资源
        最近更新 更多