我正在使用bootstrap typeahead插件。基本上,当您单击下拉菜单中的某个项目时,它需要json响应。但是,单击该项目时,我想重定向到另一个页面;我不想用json回复。我不知道如何处理这种情况。这就是我所拥有的:
def populate_global_search
respond_to do |format|
if params[:name] && params[:name][:value]
model = Model.where(name: params[:name][:value]
else
model = nil
end
if model.present?
format.json { redirect_to model }
else
format.json { head :ok}
end
end
end
该操作是从ajax调用触发的:
$(element).bind('typeahead:selected', function(obj, datum, name) {
$.ajax({
url: that.format_url(),
data: {
name : datum
}
}).done(function(data){
...
由于redirect_to不是json响应,因此单击该项时没有任何反应。我该怎么办?
答案 0 :(得分:0)
这里的主要问题是,您异步调用populate_global_search
操作,respond_to
阻止无法重定向异步调用。要解决您的问题,我建议您渲染重定向路径并按window.location
更改位置:
javascript代码(这只是一个假设):
$(element).bind('typeahead:selected', function(obj, datum, name) {
$.ajax({
url: that.format_url(),
data: {
name : datum
}
}).done(function(data){
// redirect to the desired path
window.location = data.location;
});
Rails代码(也是假设):
def populate_global_search
respond_to do |format|
if params[:name] && params[:name][:value]
# I use find_by, because where return a collection
model = Model.find_by(name: params[:name][:value])
else
model = nil
end
if model.present?
# render a json objects { location: '/some_path/12' }
# with path which you need
format.json { render json: { location: here_is_the_desired_path } }
else
format.json { head :ok }
end
end
end
奖金,你可以减少你的Rails代码,这也应该有效:
def populate_global_search
model = Model.find_by(name: params[:name].try(:[], :value))
if model.present?
render json: { location: here_is_the_desired_path }
else
head :ok
end
end