我有一个模型通过对我命名为/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
对象。
我离这里不远,还是这个容易做的事情?
答案 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