我是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 ...在控制器中结束? 。请帮我 !
答案 0 :(得分:21)
您需要调整的很多事情
<强> MVC 强>
首先,让我解释ajax如何调用应该在Rails中工作
因为Rails基于 MVC (model view controller) programming pattern - 您需要围绕此构建应用程序。对于许多新手开发者来说,问题在于解决这个问题有点棘手 - 可以相对简单地学习一些东西:
正如你所看到的,MVC基本上把#34;控制器&#34;在党的中心。您必须明白,在MVC应用中,您的请求不会进入&#34;视图&#34;首先(很多人认为) - 他们转到控制器,它从模型构建相关数据,然后为您呈现视图
因此,每当您向MVC应用程序发送请求时,您都需要记住以控制器操作为基础(而非您的视图)
-
<强>的Ajax 强>
我不知道你对ajax (Asynchronous Javascript and XML)有多少经验,但如果你没有多少经验,请让我解释一下。
Ajax基本上只是一种创建&#34;伪请求的方法。在您的浏览器中。通过&#34;伪请求&#34;,我的意思是它基本上会发送另一个请求,而不是典型的&#34;正常&#34;应用程序:
因为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原理如何工作等等