我可以在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 }
答案 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的模型类。