【问题标题】:Can't filter and search using filterrific无法使用 filterrific 过滤和搜索
【发布时间】:2016-05-11 03:51:34
【问题描述】:

当 with_role 为空时我可以过滤和搜索,但是当我想使用 with_role: supervisor or worker 搜索时我遇到了问题:

NoMethodError (undefined method `with_role' for #Array:0xb2499b54):
app/controllers/workers_controller.rb:38:in index'

如何修复或转换该数组?

这是我的代码 控制器

class WorkersController < ApplicationController
  include WorkerHelper
  def index
    (@filterrific = initialize_filterrific(
      User.where(role: %w(supervisor worker), company_id: current_user.company_id),
      params[:filterrific],
      select_options: {
        with_role: [%w(Supervisor supervisor), %w(Técnico worker)],
        search_query: ['Nro. DNI', 'Nombres', 'Apellidos']
      },
      persistence_id: false
    )) || return
    @workers = @filterrific.find.paginate(per_page: 10, page: params[:page])
  end
end

型号

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :validatable, :trackable, :timeoutable

  filterrific(available_filters: [:search_query, :with_role])
  belongs_to :company
  has_one :session
  has_many :service_workers, foreign_key: :worker_id
  has_many :services, foreign_key: :supervisor_id
  has_many :work_services, through: :service_workers, source: :service
  validates :document_number, presence: true, uniqueness: { case_sensitive: false }
  scope :principal, -> { order(role: :desc) }
  before_update :update_password_change_required, if: :encrypted_password_changed?
  before_update :disable, if: :status_changed?
  after_commit lambda {
    if transaction_record_state(:new_record)
      logger.info "CREATE User: #{inspect}"
    elsif !(transaction_record_state(:new_record) || destroyed?)
      logger.info "UPDATE User: #{inspect}"
    end
  }

  scope :search_query, lambda { |params|
    return nil if params.query.empty?
    case params.option
    when 'Nro. DNI'
      select { |w| w.document_number.to_s.include? params.query.downcase }
    when 'Nombres'
      select { |w| w.first_name.downcase.include? params.query.downcase }
    when 'Apellidos'
      select { |w| w.last_name.downcase.include? params.query.downcase }
    end
  }

  scope :with_role, lambda { |role|
    select { |u| u.role == role }
  }

end

Index.html.haml

.card.no-padding
    = form_for_filterrific @filterrific do |f|
      .items-right.search
        %span Filtrar por:
        .custom-select.blue-arrow
          = f.select(:with_role, @filterrific.select_options[:with_role],{ include_blank: 'Todos' })
        %span Buscar por:
        = f.fields_for :search_query do |field|
          .custom-select.blue-arrow
            = field.select :option, @filterrific.select_options[:search_query]
          = field.text_field :query, class: 'filterrific-periodically-observed form-control', id: 'search-text', placeholder: 'Ingrese DNI'
        = link_to 'VER TODO', reset_filterrific_url, class: 'btn btn-blue-reverse'
    = render partial: 'list', locals: { workers: @workers }

【问题讨论】:

    标签: ruby-on-rails lambda filterrific


    【解决方案1】:

    我也是使用 Filterrific Gem 的新手。

    您可能想检查您拥有的控制器中的select_option

    with_role: [%w(Supervisor supervisor), %w(Técnico worker)],
    

    查看[%w(Supervisor supervisor), %w(Técnico worker)] 正在调用的内容,我无法从您的模型中获取。它应该是模型中定义的范围的选项。

    注意:在select_options

    您在此处以过滤形式存储&lt;select&gt; 输入的任何选项。 #options_for_... 方法返回的数组可以作为选项传递给f.select,因此这些方法是在模型中定义的。

    更多信息我建议你去Filterrific Controller Explanation

    我认为你可以做的另一件事是:

    在您的模型中定义一个方法,以便您在选项中解析 [%w(Supervisor supervisor), %w(Técnico worker)]

    def self.options_for_with_role
        [
            ['Name (a-z)', 'name_asc'] #Your options goes in here
        ]
    end
    

    然后在 Controller select_option 中调用 options_for_with_role 方法,使其看起来像这样:

    class WorkersController < ApplicationController
      include WorkerHelper
      def index
        (@filterrific = initialize_filterrific(
          User.where(role: %w(supervisor worker), company_id: current_user.company_id),
          params[:filterrific],
          select_options: {
            with_role: #Your ActiveRecord based model class.options_for_with_role e.g. Worker.options_for_with_role,
            search_query: ['Nro. DNI', 'Nombres', 'Apellidos']
          },
          persistence_id: false
        )) || return
        @workers = @filterrific.find.paginate(per_page: 10, page: params[:page])
      end
    end
    

    如果它不起作用,当找到一种方法将行 User.where(role: %w(supervisor worker), company_id: current_user.company_id) 也更改为基于 ActiveRecord 的模型类时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2020-02-19
      相关资源
      最近更新 更多