2016-05-11 3 views
1

I filtern und suchen, wenn with_role ist leer, aber wenn ich with_role mit suchen will: Supervisor oder Arbeiter habe ich ein Problem:Kann nicht filtern und sucht mit filterrific

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

Wie kann ich das Problem beheben oder das Array konvertieren?

Hier ist mein Code -Controller

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 

Modell

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 } 

Antwort

0

Am als auch neu mit Filterrific Gem.

Sie könnten die select_option Linie in den Controller wollen überprüfen, wo Sie

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

prüfen, was [%w(Supervisor supervisor), %w(Técnico worker)] rufen, die ich nicht von Ihrem Modell abholen kann. Es ist eine Option für den in Ihrem Modell definierten Bereich.

Beachten Sie, dass: In select_options

Sie sind hier in der filterrific Form alle Optionen für <select> Eingaben zu speichern. Die #options_for_... Methoden geben Arrays zurück, die als Optionen an f.select übergeben werden können, daher sind diese Methoden im Modell definiert.

Weitere Informationen Ich schlage vor, Sie gehen durch Filterrific Controller Explanation

Eine andere Sache, ich glaube, Sie tun können, ist:

eine Methode in Ihrem Modell definieren, so dass Sie in Ihre Optionen analysieren [%w(Supervisor supervisor), %w(Técnico worker)]

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

Dann rufen Sie die Methode options_for_with_role in Ihrem Controller select_option suc h, dass es wie folgt aussieht:

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 

Wenn es nicht funktioniert, wenn ein Weg finden, die Linie User.where(role: %w(supervisor worker), company_id: current_user.company_id) auf Ihr Active basierte Modellklasse zu ändern.

Verwandte Themen