【问题标题】:How to pass ransack param[:q] object to another method in rails如何将ransack param [:q]对象传递给rails中的另一个方法
【发布时间】:2015-03-27 07:00:38
【问题描述】:

我正在尝试将我的 ransack params[:q] 对象传递给我的演示者类,但收到 No Ransack::Search object was provided to search_form_for! 错误。

这是我的示例代码

client_managers_widgets/index.html.haml

= search_form_for @search, :url => admin_client_managers_widgets_path do |f|
  = render :partial => "admin/share/filter_wrapper", :locals => { :f => f, :filter=> "admin/client_managers_widgets/filters/redemption_filter" }

_redemption_filter.html.haml

%table.filters
  %tr
    %td
      = f.label :created_at_gteq, "Select Period"
      = f.select :created_at_gteq, { "Start Till Date" => "", "This Year" => Date.today.beginning_of_year, "Last Month" => 1.month.ago.beginning_of_month, "This Month" => Date.today.beginning_of_month }
    %td
      = f.label :user_telecom_circle_regional_managers_id_eq, "Region"
      = f.collection_select :user_telecom_circle_regional_managers_id_eq, @telecom_regions.select_options, :id, :region, {:include_blank => t(:all)}, :class => 'telecom_circle_regional_managers_id_eq'
  %tr
    %td
      = f.label :created_at_date_gteq,"Select Custome Time"
      = f.text_field :created_at_date_gteq, :class => 'datepicker input-small'
      = f.label "-", :class=>"to"
      = f.text_field :created_at_date_lteq, :class => 'datepicker input-small'

控制器 => client_managers_widgets

def index
     @client_manager_dashboard = ClientManagerDashboard.new(current_admin_user, search_params)
     @users = @client_manager_dashboard.get users
   # .
  # .
  # .
end

private

def search_params
  params[:q]
end

presenter => client_manager_dashboard

class ClientManagerDashboard
  def initialize(admin_user, search_params)
    @current_ability = Ability.new(admin_user)
    @search_params = search_params
  end

  def get_users
    @search = User.joins(:client).where(clients: {id: clients}).search(search_params)
    @users = @search.result
  end
  private

  def current_ability
    @current_ability
  end

  def search_params
    @search_params
  end
end

现在我只是添加了基本代码 sn-p 但它是通用场景。 请让我知道任何人已经实现了这种类型的场景。

【问题讨论】:

  • 您是否尝试过使用binding.pry 单步执行?搜查也需要params[:q] 还是只需要params?最后,您是否尝试过通过@search_params 自行搜索?
  • @MikeManfrin,是的,我将@search_params 传递给了搜索,它运行良好。
  • 这证实了我的预感;尝试让您的 search_params 方法返回 @search_params ||= @search_params
  • @MikeManfrin,我试过了,但遇到了同样类型的问题。我之所以这么想是因为我没有在控制器操作中提到 Search object (like @search=Product.search(params[:q]) )

标签: ruby-on-rails ruby-on-rails-3 ransack


【解决方案1】:

你需要一个拼写Flat Scope,像这样

def define_methods
 shared = 0
 Kernel.send :define_method, :counter do
  shared
 end
 Kernel.send :define_method, :inc do |x|
  shared += x
 end
end

你可以阅读《元编程Ruby》

【讨论】:

    【解决方案2】:

    在我看来,@search 变量在这段代码中为零:

    = search_form_for @search, :url => admin_client_managers_widgets_path do 
    |f|
    

    因为@searchClientManagerDashboard 的实例变量。例如这应该有效:

    class ClientManagerDashboard
      .. 
      def get_search
        @search = User.joins(:client).where(clients: {id: clients}).search(search_params)
      end
      ..
    end
    

    在你看来:

    = search_form_for @client_manager_dashboard.get_search, :url => admin_client_managers_widgets_path do |f|
    

    【讨论】:

    • 尝试了您的解决方案,但得到未定义的方法 `get_users' 用于 nil:NilClass
    • 还有一个简单的问题,我的方法之一(也是我实现您的解决方案的地方)是返回一个 json 对象(手动创建)而不是 ransack 对象的任何实例,那么我该怎么办?
    • JSON.parse(your_json).to_query 你会得到url参数格式的json。所以你可以做.search(JSON.parse(your_json).to_query)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多