0

TokenInput プラグインを使用してトークン フィールドを作成し、メンバー (グループを作成しているユーザーの友達のみ) をグループに追加しようとしています。

だから、私はここに私の友情コントローラコードを持っています:

class FriendshipsController < ApplicationController

 def index 

 @friend_list = @current_user.friends.map { |f| {:id => f.id, :name => f.first_name + ' ' + f.last_name}}


 respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @friend_list }
 end
end

これは、URL「/friendships.json」で以下のような配列を返します。

[{"id":6,"name":"John Smith"},{"id":7,"name":"Jane Doe"}]

次に、フォームの下に TokenInput の jquery を配置します。

 <%= form_for(@group) do |f| %>


<div class="field">
<%= f.label :group_name, "Name" %><br />
<%= f.text_field :group_name %>
</div>
<div class="ui_widget">
<%= f.label :member_tokens, "Members" %><br />
<%= f.text_field :member_tokens %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

<script>
$(function() {
    $('#group_member_tokens').tokenInput("/friendships.json");
});
</script>

私の質問は、/friendships.json で配列をフィルター処理するにはどうすればよいですか? FriendshipsController で次のことを試しました。

friend_list = @current_user.friends.map { |f| {:id => f.id, :name => f.first_name + ' ' + f.last_name}}
@friend_list = friend_list.where("name LIKE ?", "%#{params[:q]}%")

...しかし、これは /friendships.json で空の配列のみを返します。

これが空の配列を返す理由を誰かが教えてくれたら、とても感謝しています。

アップデート:

私はこれをやってみました:

 @friend_list = @user_name.friends.where("name LIKE ?", "%#{params[:q]}%")
 @friend_list = @friend_list.map { |f| {:id => f.id, :first_name => f.first_name + ' ' + f.last_name}}

...しかし、コード ".where("name LIKE?", "%#{params[:q]}%")" を @friend_list = current_user.friends の最後に追加すると、何も得られなくなりましたautocomplete は TokenInput フィールドに結果を返します (「No Results」を返します)。

たとえば、「http://localhost:3000/friendships.json?q=k」のように、手動で URL に q パラメータを入力すると、空の配列になってしまいます。first_name Kevin のユーザーがアプリケーションに含まれているため、これは奇妙です。

私のRubyサーバーで出力されるものは次のとおりです。

Started GET "/friendships.json?q=ke" for 127.0.0.1 at 2012-09-16 19:27:53 -0400
Processing by FriendshipsController#index as JSON
Parameters: {"q"=>"ke"}
[...]
User Load (0.7ms)  SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users"."id" = "friendships"."friend_id" WHERE "friendships"."user_id" = 2 AND (first_name LIKE '%ke%')
[...]

ただし、tokenInputのtext_fieldに「evin」と入力しようとしたところ、ユーザーが見つかりました。何らかの理由で、q パラメータがユーザーの first_name の最初の文字を見つけることができません。誰でもこれについて何か考えがありますか?

4

2 に答える 2

1

どうやら postgresql は LIKE クエリを大文字と小文字を区別すると見なしているようです。これが、検索クエリがユーザー名の大文字の最初の文字を見つけられなかった理由です。代わりに、postgresql で ilike を使用する必要があります。これに関するスレッドを参照してください: https://groups.google.com/forum/?fromgroups=#!topic/heroku/b6_dJyTXrCU

動作したコードは次のとおりです。

class FriendshipsController < ApplicationController

def index 
@friend_list = @user_name.friends.where("name ilike ?", "%#{params[:q]}%")
@friend_list = @friend_list.map { |f| {:id => f.id, :name => f.name}}
[...]
end
于 2012-09-17T04:07:51.673 に答える
0

あなたが書いたことから、空の配列だけでなく、サーバー エラー (500) が予想されます。これをコントローラーに書き込むと、次のようになります。

friend_list = current_user.friends.map { |f|
  {:id => f.id, :name => f.first_name + ' ' + f.last_name}
}
@friend_list = friend_list.where("name LIKE ?", "%#{params[:q]}%")

問題が発生します。まず、 から友人のコレクションを取得し、current_userそれを配列にマッピングします。次に、次の行で、作成した配列に対して ActiveRecord #where メソッドを呼び出します。しかし、これfriend_listは ActiveRecord コレクションではないため、「undefined method 'where' for [...]:Array」などのエラーが発生するはずです。

あなたがやろうとしていることはこれだと思います:

@friend_list = current_user.friends.where("name LIKE ?", "%#{params[:q]}%")
@friend_list = @friend_list.map { |f|
  {:id => f.id, :name => f.first_name + ' ' + f.last_name}
}
于 2012-09-16T22:17:29.900 に答える