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 的末尾时,我不再得到任何TokenInput 字段中的自动完成结果(它返回“No Results”)。

当我在 URL 中手动输入 q 参数时,例如“http://localhost:3000/friendships.json?q=k”...我最终得到一个空数组。这很奇怪,因为我的应用程序中有一个名为 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 参数找不到用户名字的第一个字母。有人对此有任何想法吗?

4

2 回答 2

1

显然 postgresql 认为 LIKE 查询区分大小写,这就是搜索查询没有找到用户名的大写首字母的原因。相反,您必须将 ilike 与 postgresql 一起使用。在此处查看有关此内容的主题: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 回答