无法使用filterrific

时间:2016-05-11 03:51:34

标签: ruby-on-rails lambda filterrific

我可以在with_role为空时进行过滤和搜索,但是当我想使用with_role进行搜索时:主管或工作人员我遇到了问题:

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 }

1 个答案:

答案 0 :(得分:0)

使用Filterrific Gem也是新手。

您可能需要检查控制器中的select_option

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

检查[%w(Supervisor supervisor), %w(Técnico worker)]正在呼叫的内容,我无法从您的模型中选择。它可能是您的模型中定义的范围的选项。

请注意:在select_options

  

您在此处以filterrific形式存储<select>输入的所有选项。       #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的模型类。