2016-08-25 10 views
0

私はブートストラップのtypeaheadプラグインを使用しています。基本的には、ドロップダウンメニューのアイテムの1つをクリックすると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 

アクションは、Ajax呼び出しからトリガーされます。redirect_toはJSONレスポンスではありません

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

ので、私は項目をクリックすると、何も起こりません。私に何ができる?

+0

あなたはどのようにこの行動を呼びますか? –

+0

@Зелёныйアクションはブートストラップの先頭から呼び出されます。http://getbootstrap.com/2.3.2/javascript.html#typeahead – Donato

+0

ok、いくつかの 'ajax'ですか?コードを共有できますか? –

答えて

0

ここでの主な問題は、populate_global_searchアクションを非同期に呼び出し、respond_toブロックが非同期呼び出しをリダイレクトできないことです。 (それは単なる仮定です)

javascriptのコード:あなたの問題を解決するために私はあなたがリダイレクトとwindow.locationで場所を変更するには、パスを描画示唆

$(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 
関連する問題