2016-08-25 3 views
0

Ich benutze ein Bootstrap TypeAhead Plugin. Grundsätzlich erwartet es eine json-Antwort, wenn Sie auf eines der Elemente im Dropdown-Menü klicken. Wenn das Objekt angeklickt wird, möchte ich jedoch auf eine andere Seite umleiten; Ich möchte nicht mit Json antworten. Ich weiß nicht, wie ich mit dieser Situation umgehen soll. Das ist, was ich habe:Antwort mit Umleitung auf JSON Anfrage

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 

Die Aktion wird von einem Ajax-Aufruf ausgelöst:

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

Da die redirect_to kein json Antwort ist, passiert nichts, wenn ich auf den Artikel klicken. Was kann ich tun?

+0

Wie nennt man diese Aktion? –

+0

@ Зелёный Aktion wird von Bootstrap typeahead aufgerufen http://getbootstrap.com/2.3.2/javascript.html#typeahead – Donato

+0

ok, ist einige 'ajax'? Könnten Sie den Code teilen? –

Antwort

0

Das Hauptproblem hier, rufen Sie die populate_global_search Aktion asynchron, respond_to Block nicht umleiten einen asynchronen Aufruf. So beheben Sie Ihr Problem, das ich vorschlagen, dass Sie den Weg machen zu umleiten und den Standort zu wechseln, indem window.location:

Der Javascript-Code (das ist nur eine Vermutung):

$(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; 
    }); 

Der Rails-Code (auch Annahme):

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 

Bonus können Sie Ihre Rails-Code reduzieren, sollte dies auch Werke:

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 
Verwandte Themen