Rails form_tag远程示例
我有这个令人难以置信的简单forms:
我从文档中知道,我可以通过远程选项使用AJAX:
然后我卡住了。 我知道如何在视图/部分中生成结果,但是如何在div元素中获取该部分? 我知道一些JQuery,所以我可以选择元素。 我发现了很多结果,但他们似乎错过了我的灯泡时刻。 我正在使用Rails 4.1.6
我的结果只是来自模型的简单记录,如Book(标题,作者)
谢谢你的帮忙!
编辑
我因为远射失误而赢得了比赛。 我不得不在视图文件夹中添加search.js.erb而不是资产。
假设您从搜索方法中获取@results
。
在控制器中,搜索方法:
respond_to do |format| format.html {render or redirect_to wherever you need it} format.js end
然后,您只需要一个名为search.js.erb
的文件,以便在请求结束时运行所需的js。 它可能看起来像:
$('#results_div').html("<%= j @results.pluck(:title).join('
') %>")
当你添加remote:true时, jquery-ujs将为你提供ajax请求(默认情况下,app / assets / javascripts / application.js中需要这个javascript lib)。
ajax调用将请求’text / javascript’响应。 因此,您的服务器代码应回复:
# action def search_query respond_to do |format| format.js { # additional code } end end
如果在您的视图( search_query.js.erb
)中提供了javascript,它将被执行。 这就是为什么每个人都用$('#my_div_id').html('my html text')
建议回复你,这个建议在执行时会用新HTML替换你的div内容。
如果由于某种原因你想要返回一个json数据结构,那么你应该提供一个不同的数据类型:
form_tag("/jquery_ujs/search_query", remote: true, 'data-type' => :json) do # .... end
你应回复:
# action def search_query respond_to do |format| format.json { render json: @my_object } end end
并处理成功事件:
您还可以请求html响应(例如,如果您想要返回一个表),请执行以下操作:'data-type' => :html
和format.html { render layout: false }
阿贾克斯
首先, Rails UJS(不显眼的javascript)驱动程序只是为您提供了一种“jar装”方式来向您的浏览器发送ajax请求。 为避免混淆,最好不要理解您将发送Ajax请求,无论您使用的是Rails UJS
还是标准的Ajax方法
这意味着从Ajax捕获response
的过程仍然相同 – 您需要确保必须从系统中捕获响应
要么: –
#app/assets/javascripts/application.js $(document).on("ajax:success", ".element", function(status, data, xhr) { // do something here });
要么
#app/controllers/portal_controller.rb class PortalController < ApplicationController def search respond_to do |format| format.js #-> app/views/portal/search.js.erb format.html end end end #app/views/portal/search.js.erb //something here
固定
如何在div元素中获得部分内容
你将能够使用JS:
#app/controllers/portal_controller.rb class PortalController < ApplicationController def search @results = ... respond_to do |format| format.js format.html end end end #app/views/portal/search.js.erb $(".div").html("<%=j render @results %>");