3

select2 jquery gem を使用しています。ユーザーの入力内容に一致するトピックのリストを取得しようとしています。期待どおりに機能せず、その理由を見つけるために一日中費やしました。コンソールにこのエラーが表示され続けます

Uncaught TypeError: Cannot call method 'toUpperCase' of undefined select2.js?body=1:363
Uncaught TypeError: Cannot call method 'localeCompare' of undefined 

2 番目のエラーは、この行の js ファイルにリンクしています

return this.text.localeCompare(term) === 0;

私が間違っていることはありますか?前もって感謝します。

私のルート:

get '/topic/topic_list' => 'topic#topic_list'

私のトピックコントローラーには次のものがあります:

def topic_list
    @topics = Topic.order(:name)
    respond_to do |format|
        format.html
        format.json { render json: @topics.where('name like ?', "%#{params[:q]}%") }
    end
end

トピック js ファイル

$(function () {
    $('#story_topic_list').select2({
        tags: true,
        width: '100%',
        tokenSeparators: [","," "],
        createSearchChoice: function(term, data) {
        if ($(data).filter(function() {
              return this.text.localeCompare(term) === 0;
            }).length === 0) {
              return {
                id: term,
                text: term
              };
            }
        },
        multiple: true,
        maximumSelectionSize: 5,
        formatSelectionTooBig: function (limit) {
            return 'You can only add 5 topics'

        },
        ajax: {
            dataType: 'json',
            url: '/topic/topic_list.json',
            data: function (term, page) {
                return { q: term };
            },
            results: function(data, page) {
                return { results: data };
            }
        }
    })
});

私の形で私は持っています

<%= f.label :topic_list %>
<%= f.text_field :topic_list %>

また、 /topic/topic_list.json はこれを返します:

[{"id":2,"name":"app","added_by":null,"cover_id":null,"created_at":"2014-03-23T20:12:24.615+00:00","updated_at":"2014-03-23T20:12:24.615+00:00","count":1},{"id":5,"name":"app tech website","added_by":1,"cover_id":null,"created_at":"2014-03-23T20:23:33.754+00:00","updated_at":"2014-03-23T20:23:33.754+00:00","count":1},{"id":3,"name":"tech","added_by":null,"cover_id":null,"created_at":"2014-03-23T20:12:24.668+00:00","updated_at":"2014-03-23T20:12:24.668+00:00","count":1},{"id":4,"name":"website","added_by":null,"cover_id":null,"created_at":"2014-03-23T20:12:24.677+00:00","updated_at":"2014-03-23T20:12:24.677+00:00","count":1}]
4

1 に答える 1

7

select2 は、返されたデータからどのフィールドを使用するかを認識していません。nameそれがフィールドであると仮定して、この関数を個別に追加します(select2ではありません):

function format(item) { return item.name; }

select2 には次の 2 つのオプションがあります。

formatSelection: format,
formatResult: format
于 2014-03-24T09:08:01.570 に答える