保留多个端点/控制器功能之间的Ransack搜索

时间:2013-06-21 15:37:00

标签: ruby-on-rails ransack

我有一个模型通过对我命名为/model/filter的ajax调用和端点来更新其结果,并且我正在尝试将搜索结合到混合中。我已经添加了Ransack,它在索引上运行得很好(如果我只是搜索),但我希望它在我应用过滤器时也能正常工作。

在我的控制器功能中,我已将@models = Model.scoped替换为

def filter
  @search = Model.search(params[:q])
  @models = @search.result.scoped

  # apply other filters...
end

但是,当ajax调用执行此函数时,我会返回不使用搜索词的结果。

我要么确保params[:q]达到/model/filter处于与加载/model/index时相同的状态(JS解决方案),或者我希望能够访问当我调用@search(Ruby解决方案)时,相同的filter对象。

我离这里不远,还是这个容易做的事情?

3 个答案:

答案 0 :(得分:2)

经过多次搜索,我找到了解决方案。

/model/index中,我添加了Rails.cache.write("q",params[:q])

然后,在/model/filter中,我在致电params[:q] = Rails.cache.read("q")之前添加了@search = Model.search(params[:q])

答案 1 :(得分:1)

您也可以使用会话。超级简单。在您的搜索控制器中:

@your_model = YourModel.where(some_filter_criteria_if_necessary: "something")
@q = @your_model.search(params[:q] ? params[:q] : session[:search])
@your_model = @q.result(distinct: true).page params[:page]
if params[:q]
  session[:search] = params[:q]
end

这样,只有在提供新标准时才会覆盖会话。

答案 2 :(得分:0)

这是我使用应用程序控制器的基于会话的解决方案。为不同的控制器和动作存储不同的参数

class ApplicationController < ActionController::Base
  before_filter :store_and_set_search_params

  # store params of ransack into session and set @search_params variable
  # controller_name and action_name have different definition for rails < 4.1
  def store_and_set_search_params
    session[:q] = session[:q].deep_merge({controller_name => { action_name => params[:q] }}) if params[:q]
    @search_params = session.try(:[],:q).try(:[], controller_name).try(:[], action_name)
  end
end

动作:

def index
  @search = Item.search(@search_params)
  @items = @search.result
end