如何使用ajax将数据发送到rails上的ruby中的控制器

时间:2014-08-23 07:53:54

标签: ruby-on-rails ruby

我是ROR.i中的新开发人员,使用带事件更改的ajax将show.html.erb中select_tag的数据发送到def show ... end中的控制器。我尝试发送数据,但我的脚本不工作。我的脚本是:

<script type="text/javascript">
    $('#cbo').change(function() {
       $.ajax({
        url: "/product_details/show",
        type: "POST",
        data: {"cbo_id" : $('#cbo').val()},
        dataType: "html",
        success: function(data) {
          alert('successfully');
        }
      });
    });
</script>

in product_details / show.html.erb

<%= form_tag(product_detail_path, :method => "post") do %>
  <%= select_tag "categories", options_from_collection_for_select(Category.all, :id,     :category_name),:id => 'cbo' %>
<% end %>

def show
  @getcbo = params[:cbo_id]
end

我认为url可能不对:“/ product_details / show”。那么我如何使用url将数据发送到def show ...在控制器中结束? 。请帮我 !

1 个答案:

答案 0 :(得分:21)

您需要调整的很多事情


<强> MVC

首先,让我解释ajax如何调用应该在Rails中工作

因为Rails基于 MVC (model view controller) programming pattern - 您需要围绕此构建应用程序。对于许多新手开发者来说,问题在于解决这个问题有点棘手 - 可以相对简单地学习一些东西:

enter image description here

正如你所看到的,MVC基本上把#34;控制器&#34;在党的中心。您必须明白,在MVC应用中,您的请求不会进入&#34;视图&#34;首先(很多人认为) - 他们转到控制器,它从模型构建相关数据,然后为您呈现视图

因此,每当您向MVC应用程序发送请求时,您都需要记住以控制器操作为基础(而非您的视图)

-

<强>的Ajax

我不知道你对ajax (Asynchronous Javascript and XML)有多少经验,但如果你没有多少经验,请让我解释一下。

Ajax基本上只是一种创建&#34;伪请求的方法。在您的浏览器中。通过&#34;伪请求&#34;,我的意思是它基本上会发送另一个请求,而不是典型的&#34;正常&#34;应用程序:

enter image description here

因为HTTP is "stateless"(IE不会保留任何设置/&#34;州&#34;),所以没有办法提供&#34;实时&#34;没有像Web套接字那样的连接。

Ajax为您提供发送和发送功能。在典型加载过程完成后接收数据,使您看起来在&#34;实时&#34;中接收数据。实际上,您只是向您的应用发送伪请求(始终记住Ajax不是魔法)


<强>代码

您的代码需要在多个地方进行更改

-

首先,您需要make your javascript unobtrusive(IE将其从您的观看中移除并放入您的资产图谱中)

#app/assets/javascripts/application.js
$(document).on("change", "#cbo", function() {
   $.ajax({
   url: "/product_details/show",
   type: "POST",
   data: {"cbo_id" : $(this).val()},
   dataType: "json",
   success: function(data) {
       alert('successfully');
     }
   });
});

#app/controllers/product_details_controller.rb
Class ProductDetailsController < ApplicationController
   respond_to :js, :json, :html

   def show
      @product = Product.find params[:id]
      respond_with @product
   end
end

这将使您能够接收您在控制器中设置的产品JSON对象,这是一个非常基本的示例。

如果你给我一些关于你想要达到的目标的更多信息,我当然会给你一个更精致的解决方案;希望上面的代码演示了MVC原理如何工作等等