1

我有一个模型,它通过对我命名的 ajax 调用和端点更新其结果/model/filter,并且我正在尝试将搜索合并到组合中。我添加了 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调用时访问同一个对象filter(Ruby 解决方案)。

我在这里离基地很远吗,还是这很容易做到?

4

3 回答 3

2

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

@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

只有在提供新标准时才会覆盖这种方式会话。

于 2013-12-24T01:20:56.947 回答
2

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

/model/index,我补充说Rails.cache.write("q",params[:q])

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

于 2013-06-21T20:17:59.893 回答
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
于 2014-05-07T11:27:48.963 回答