【发布时间】:2017-04-04 19:01:43
【问题描述】:
我的页面上有一个有效的搜索机制;带有文本字段和带有“搜索”标签的提交按钮的表单。
我的页面上还有一个基于 raphael.js 的动画项目,上面有我想要执行搜索的可点击项目。
点击时,我向控制器发送数据,这些数据旨在作为从 raphael 对象中提取的搜索词。
正在传递数据,控制器代码运行,但相应的视图无法呈现,因此点击对用户来说似乎什么都不做。
所以在点击时,我会像这样进行 Ajax 调用:
文件 searchthing.js
// Add a search function
circle.click(function (e) {
var csrch = this.data('label');
// alert('clicked ' + csrch);
e.preventDefault();
$.ajax({
type: "GET",
url: "/bubbleBar",
data: $.param({ srchterm: csrch} ),
success: function(){
// window.location.replace("/pictures");
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("--- error: " + errorThrown);
}
});
});
我的控制器中的“bubbleBar”动作成功触发,传输搜索词,并重定向到我的工作索引动作,它处理搜索:
文件 myController.rb:
def bubbleBarSearch
redirect_to pictures_path(:srchterm => params[:srchterm])
end
def index
# Initialize the pictures array
#
@pictures = Picture.first
if params[:srchterm].present?
# If the search button was hit, search pictures for the terms
@pictures = []
results = Picture.search(params[:srchterm], page: params[:page])
results.each do |x|
@pictures << x
end
# Also search keywords for the search terms
#
keywords = Keyword.search(params[:srchterm], page: params[:page])
# Retrieve images based on keywords
#
keywords.each do |kw|
pics = Picture.where(:id => kw.picture_id)
pics.each do |pic|
# Only add to results if unique
#
if !@pictures.include? pic
@pictures << pic
end
end
end
respond_to do |format|
format.html {
puts '---------------- ding -----------------'
# Redirect_to pictures_path
}
format.js {alert('dong');}
end
else
@pictures = Picture.all.order("RANDOM()")
end
end
我遇到的问题是 Ajax 返回成功,但“索引”操作的相应视图没有呈现。
如果我取消注释 'window.location.replace("/pictures");'我的 JavaScript 代码中的行,我可以强制渲染成功,但我丢失了控制器代码为我获得的搜索结果。如果我取消注释控制器中的“redirect_to pictures_path”行,我当然会得到一个无限循环错误出去。
到目前为止我所做的研究告诉我应该在控制器中捕捉响应。
我之前没有使用过 respond_to,并且似乎 format.html 被 Ajax 调用命中,但是当我使用页面上已经设置的搜索字段/按钮机制手动进行搜索时也会触发。我不清楚为什么我的 Ajax 调用以 HTML 而不是 JavaScript 的形式出现。
这意味着如果我在控制器中手动处理视图的呈现,我不会发现当搜索没有通过已经工作的机制并且冒着呈现页面两次或以其他方式引入的风险时我的网站出现故障。
我不知道如何让我的 click/Ajax 调用在控制器操作发生后成功地从 click 函数呈现所需的视图。我在这里想念什么?实现这一目标的理想方法是什么,并且不会丢失我需要成功渲染的控制器数据?
Ruby on Rails 的输出表明服务器认为它正在呈现正确的 Haml 视图文件,但是我在文件底部放置了一个 JavaScript 标记以将输出记录到控制台,单击后控制台为空。如果我通过站点导航到同一个视图,该语句将输出到控制台。
我已经修改了我的 Ajax 成功回调以具有一个参数,并且在检查后该变量包含视图的 HTML 代码。那么Ruby on Rails 是否将输出定向到Ajax 而不是浏览器?然后如何从 Ajax 成功回调中呈现该输出?
对控制器的成功调用包含我的 Ajax 调用中没有的 utf8 参数。这是一个因素吗?
【问题讨论】:
标签: ruby-on-rails ajax redirect render