响应json请求的重定向

时间:2016-08-25 20:03:36

标签: ruby-on-rails json

我正在使用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响应,因此单击该项时没有任何反应。我该怎么办?

1 个答案:

答案 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