Rails gem rails3-jquery-autocomplete如何按用户范围

时间:2011-08-30 14:05:29

标签: ruby-on-rails ruby ruby-on-rails-3 jquery-autocomplete named-scope

我正在使用Rails gem rails3-jquery-autocomplete来为帖子添加类别。

我想将搜索限制为仅包含属于当前用户或帖子作者的类别。

文档说我可以指定范围:

  

:范围

     

添加了使用范围的选项。传递数组中的范围。例如:scopes =>   [:scope1,:scope2]

但我不确定如何在这里传递用户ID?

这似乎是一个comon场景,我错过了一些明显的东西吗?

我找到了一个建议修改get_item方法的答案,但这似乎打破了自动完成

Scoping the results for rails3 jquery autocomplete plugin

7 个答案:

答案 0 :(得分:17)

posts_controller

 def get_autocomplete_items(parameters)
    items = super(parameters)
    items = items.where(:user_id => current_user.id)
  end

我首先调用原始的get_autocomplete_items方法,然后通过current_user.id过滤掉结果。

这个问题有帮助: Rails 3: alias_method_chain still used?

答案 1 :(得分:8)

由于上面的答案,我遇到了类似的问题。

我的自动完成功能也适用于用户模型,但我需要将结果限制在用户的机构(机构有很多:用户)。我的控制器创建一个在视图中访问的@institution实例变量。

虽然get_autocomplete_items方法无法直接访问实例变量,但我发现数据可以作为参数传递给自动完成(注意:我使用的是simple_forms gem,因此输入调用看起来与标准的rails语法略有不同)

在我看来:

<%= f.input :email,  :url => autocomplete_user_email_institutions_path(:institution_id=>@institution.id.to_s), :as => :autocomplete %>

在我的控制器中:

  autocomplete :user, :email, :extra_data => [:first_name, :last_name]

  def get_autocomplete_items(parameters)
    super(parameters).where(:institution_id => params[:institution_id])
  end

我的自动填充列表现在仅限于为特定机构工作的用户。

答案 2 :(得分:6)

deb的回答对我有用。 代码可以清理一下:

def get_autocomplete_items(parameters)
  super(parameters).where(:user_id => current_user.id)
end

答案 3 :(得分:3)


对于那些遇到超级方法问题的人来说代码有一个小的更新。由于动态调度,上面的代码需要替换如下:

def get_autocomplete_items(parameters)
 items = super(parameters)
 items = items.where(searchable: true)
end

到此:

def get_autocomplete_items(parameters)
 items = active_record_get_autocomplete_items(parameters)
 items = items.where(searchable: true)
end

参考:https://github.com/crowdint/rails3-jquery-autocomplete/issues/278

答案 4 :(得分:2)

要回答@ ctilley79提出的问题,多个自动填充不是问题,因为除了可以在params散列中传递更多值之外,您还可以访问自动填充参数。在我的表单上(作为示例),我同时拥有City和Zip自动完成功能。我需要将城市限制在某个州。所以我的控制器动作如下所示:

def get_autocomplete_items(parameters)
  if (parameters[:model] == City)
    super(parameters).where("state_id" => params[:state_id])
  else
    super(parameters)
  end
end

您也可以在需要时访问该方法。对参数执行logger.debug以查看所有可用的内容。

答案 5 :(得分:1)

我知道这个gem和问题很旧,但是我发现自己正在使用这个gem并最近需要这个答案...所有的旧答案都不再有效,因为在源代码中,方法get_autocomplete_items是动态生成的,并且具有ORM在方法名称之前。这就是它为我工作的原因。我假设大多数人也使用ActiveRecord,但请检查autocomplete.rb方法“ get_prefix”以弄清楚应使用哪种方法名称才能使其正常工作。

希望这可以节省一些时间。成为您想看到的变化;)

def active_record_get_autocomplete_items(parameters)
  super(parameters).where(id: current_user.id)
end

答案 6 :(得分:0)

我遇到了类似的问题。我们的网站是多租户,所以一切都需要与租户相关。

为了简化这一过程,我修改了rails3-jquery-autocomplete以接受另一个名为base_scope的选项。它需要一个字符串,它被eval'd而不是使用模型。所有其他功能都有效,因此您可以根据需要添加其他范围和where子句。

我的叉子在这里:https://github.com/GiveCorps/rails3-jquery-autocomplete

我不确定我写的测试证明它会一直有效。我只是检查了它是在items方法中使用范围而不是模型。

我会很感激任何想法。不确定它是否值得拉取请求。