【问题标题】:Preserve Ransack search between multiple endpoints/controller functions保留多个端点/控制器功能之间的 Ransack 搜索
【发布时间】:2013-06-21 15:37:00
【问题描述】:

我有一个模型,它通过 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/index 时相同的状态到达/model/filter(JS 解决方案),要么我希望能够在以下情况下访问相同的@search 对象我打电话给filter(Ruby 解决方案)。

我是不是离基地很远,还是这很容易做到?

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    经过一番搜索,我找到了解决方案。

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

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

    【讨论】:

    • 好。我正在设计一个需要搜索栏始终可见的网站,所以.. 我正在考虑将 Ransack(控制器)操作放在应用程序控制器中。你是这样做的吗?如果你能提供更多关于你如何做到的细节,那对我真的很有帮助。你能给我你找到解决方案的链接吗?谢谢!
    【解决方案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
    

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        • 2023-03-15
        相关资源
        最近更新 更多