2013-05-09 1 views
0

Итак, я только что обнаружил select2. Потрясающие. Теперь я пытаюсь понять, как его использовать, на стороне сервера с ajax/json. Все примеры, которые я вижу повсюду, показывают использование select2 с JSONP для извлечения данных из внешнего источника. Я чувствую, что это должно быть еще проще, если вы звоните из локальной модели, нет? Я доберусь до ничтожного песчаника. json возвращает значение, но поисковый запрос не автозаполняется, он остается пустым.select2 AJAX'd для модели, конфигурация

вид HTML:

<%= form_tag request_pal_path, remote: true do %> 
    <%= hidden_field_tag :email, nil, class: 'ui-corner-all' %> 
    <%= submit_tag "Send request", class: 'button' %> 
<% end %> 

и вызывая некоторые JS на нем:

$(document).ready(function() { 
    $("#find_user #email").select2({ 
    width: '400px', 
    placeholder: "Find user...", 
    minimumInputLength: 1, 
    multiple: false, 
    id: function(obj) { 
     return obj.id; // use slug field for id 
    }, 
    ajax: { // instead of writing the function to execute the request we use Select2's convenient helper 
     url: "/users", 
     dataType: 'json', 
     data: function (term, page) { 
     return { 
      q: term, // search term 
      page_limit: 10 
     }; 
     }, 
     results: function (data, page) { // parse the results into the format expected by Select2. 
     // since we are using custom formatting functions we do not need to alter remote JSON data 
     return {results: data}; 
     } 
    }, 
    formatResult: FormatResult, 
    formatSelection: FormatSelection, 
    escapeMarkup: function (m) { return m; } 
    }); 

}) 

function FormatResult(user) { 
    return '<div>' + user.name + '</div>'; 
} 

function FormatSelection(user) { 
    return user.name; 
} 

, который идет к контроллеру, user index action:

def index 
    @find = User.where('name LIKE ?', "%#{params[:q]}%") 
    @users = @find.where('id NOT IN (?)', current_user.id).order('random()').page(params[:page]).per(100) 
    @title = "Potential pals" 
    respond_to do |format| 
    format.html 
    format.js { 
     @find = @find 
     @users = @users 
    } 
    format.json { @find } 
    end 
end 

и я сделал файл .json для ответа (не уверен, что это даже необходимо):

<% @find.each do |user| %> 
    <%= user.name %> 
<% end %> 

Таким образом, json работает в определенной степени. Если я смотрю в консоли разработчика, он показывает ответ, исходящий от http://localhost:3000/users.json?q=tay или whereever, и возвращает одно значение для Taylor (в этом случае). Но когда я ищу внутри окна выбора select2, он просто вращается и вращается, без каких-либо результатов. Нет консольных ошибок, так что это хорошо, ха. Мысли? Благодаря!

ответ

1

Я думаю, проблема в вашем .json-файле, так как select2 нуждается в json-массиве или объекте json. Попробуйте удалить его и ответьте format.json { render json: @find.to_json }. Другой код мне кажется вполне подходящим.

+0

это дает мне ошибку относительно отсутствующего шаблона. 'Отсутствуют пользователи/индекс шаблонов, application/index с {: locale => [: en],: formats => [: json],: handlers => [: erb,: builder,: coffee]}. Поиск: * ' – Dudo

+0

это действительно так! Я пошел с вами двумя комбинациями ... format.json {render json: @find}. Я был так близок, LOL. – Dudo

+0

Да, я забыл 'render json:', извините. Рад, что вы преуспели. –

2

Выбор2 плагин ожидает данных JSON в следующем формате:

[ { "text": "Taylor", "id": 1 }, { "text" : "Tailor", "id": 2 }, ...] 

Так что вам нужно заменить name с text в модели пользователя при преобразовании в JSON:

def as_json(*args) 
    super.tap { |hash| hash["text"] = hash.delete "name" } 
end 

, а затем в индексный метод:

def index 
    @find = User.where('name LIKE ?', "%#{params[:q]}%") 
    @users = @find.where('id NOT IN (?)', current_user.id).order('random()').page(params[:page]).per(100) 
    @title = "Potential pals" 
    respond_to do |format| 
    format.html 
    format.js { 
     @find = @find 
     @users = @users 
    } 
    format.json { render json: @find, :only => [:text, :id] } # might be :name here ? 
    end 
end 

, и вам не нужен для JSON.

+0

select2 ожидает формат '{id: ..., text: ...}', только если вы используете стандартную реализацию formatResult, если используете свою собственную функцию, вы можете предоставить любой формат, который вы хотите. –

+0

Да, не нужно было все это делать, но «рендер» был билетом. благодаря! иметь upvote =) – Dudo