1

我正在使用非常有用的has_scope gem。我有一个通过在链接中传递范围创建的索引页面。

<%= user_collections_path(@user, got: true) %>

在那个索引页面上,我可以查询 current_scopes。

我在该页面上有一个非常标准的 ransack 搜索表单,但使用它会返回没有任何范围的结果。

如何将 current_scopes 传递给搜索?我尝试使用隐藏字段,但无法正常工作。我想如果我可以通过链接传递范围,我应该能够以一种形式传递它们,但是在谷歌搜索之后我不确定这是真的。

搜索表格

<%= search_form_for @search, :html => {:method => :post} do |f| %>
    <%= f.text_field :name_or_miniature_name_cont, class: "span3" %>
    <%= f.submit "Search", class: "btn" %>
<% end %>

指数法

 def index
    @user = User.find_by_username(params[:user_id])
    @search = apply_scopes(@user.collections).search(params[:q])
    @search.sorts = 'created_at desc' if @search.sorts.empty?  
    @collections = @search.result.paginate(page: params[:page])
 end
4

3 回答 3

1

使用 Ransack 1.6+ 中的新功能,您可以在 Ransack 搜索中引入范围,但首先您需要将它们列入白名单,如下所示:

class Employee < ActiveRecord::Base
  scope :active, ->(boolean = true) { where(active: boolean) }
  scope :salary_gt, ->(amount) { where('salary > ?', amount) }

      # `ransackable_scopes` by default returns an empty array
      # i.e. no class methods/scopes are authorized.
      # For overriding with a whitelist array of *symbols*.
      #
   def self.ransackable_scopes(auth_object = nil)
    [:active, :salary_gt]
   end
end

然后你可以像这样触发它们:

Employee.ransack({ active: true, hired_since: '2013-01-01' })

Employee.ransack({ salary_gt: 100_000 }, { auth_object: current_user })

您也可以照常将它们添加到您的 search_form_for 中。

我希望这有帮助。

于 2015-02-12T17:12:20.697 回答
0

您可以从当前存储/检索数据,session而不是将其放入 url 参数中。

引用对问题的评论:

这就是 has_scope 支持 :default 的原因,因此您可以让 proc 从会话中检索值:

has_scope :degree, :default => proc { |c| c.session[:some_value] }

于 2014-06-26T17:31:13.023 回答
0

您可以在操作 url 中传递当前范围:

<%= search_form_for @search, url: search_people_path(current_scopes), do |f| %>
于 2017-04-20T17:08:02.783 回答