2016-08-25 4 views
0

Я использую плагин типа bootstrap. В принципе, он ожидает ответ json, когда вы нажимаете на один из элементов в раскрывающемся меню. Однако, когда элемент щелкнут, я хочу перенаправить на другую страницу; Я не хочу отвечать 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 

Действие срабатывает от АЯКС вызова:

$(element).bind('typeahead:selected', function(obj, datum, name) { 
    $.ajax({ 
    url: that.format_url(), 
    data: { 
     name : datum 
    } 
    }).done(function(data){ 
    ... 

Поскольку redirect_to не является ответом JSON, ничего не происходит, когда я нажимаю на элемент. Что я могу сделать?

+0

Как вы называете это действие? –

+0

@ Зелёное действие вызывается из bootstrap typeahead http://getbootstrap.com/2.3.2/javascript.html#typeahead – Donato

+0

ОК, это какой-то 'ajax'? Не могли бы вы поделиться кодом? –

ответ

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 
Смежные вопросы