1. Introduction
This post gathers information about FAQ-Frequently Asked Question, How To, technical document references and samples about these RAILS topics.- Using scopes on Rails to Filter index page and Re-display filter inputs
2. FAQ, HOWTO, REFERENCES, SAMPLES, etc
2.1. Create model scopes for each filter condition
# vim app/models/cluster_config.rb
class ClusterConfig < ApplicationRecord
include Filterable
scope :cluster_config, -> (id) { where id: id}
scope :cluster_status, -> (cluster_status_id) { where cluster_status_id: cluster_status_id}
scope :cluster_environment_type, -> (cluster_environment_type_id) { where cluster_environment_type_id: cluster_environment_type_id}
scope :cluster_content_type, -> (cluster_content_type_id) { where cluster_content_type_id: cluster_content_type_id}
end
2.2. Implement generic filter on model concerns
# vim app/models/concerns/filterable.rb
module Filterable
extend ActiveSupport::Concern
module ClassMethods
def filter(filtering_params)
results = self.where(nil)
filtering_params.each do |key, value|
results = results.public_send(key, value) if value.present?
end
results
end
end
end
2.3. Implement filter on index controller
# vim app/controllers/cluster_configs_controller.rb
class ClusterConfigsController < ApplicationController
before_action :set_cluster_config, only: [:show, :edit, :update, :destroy]
:
def index
@cluster_configs = ClusterConfig.filter(params.slice(:cluster_config, :cluster_status, :cluster_environment_type, :cluster_content_type)).paginate(page: params[:page], per_page: 20)
end
:
private
def set_cluster_config
@cluster_config = ClusterConfig.find(params[:id])
end
:
def cluster_config_params
params.require(:cluster_config).permit(:cluster_status_id, :cluster_environment_type_id, :cluster_content_type_id, :url_rest_service, :db_host, :db_port, :db_name, :dt_created, :dt_delivered, :obs)
end
end
2.4. Implement filter on index viewer
# vim app/views/cluster_configs/index.html.erb
<h3>Filter by:</h3>
<%= form_for cluster_configs_path do %>
<div>
Id: <%= text_field_tag 'cluster_config', '' %>
Status Massa: <%= select("cluster_status", "cluster_status", ClusterStatus.all.map {|a| [a.cluster_status, a.id] }, { include_blank: true }) %>
Environment Type: <%= select("cluster_environment_type", "cluster_environment_type", ClusterEnvironmentType.all.map {|a| [a.cluster_environment_type, a.id] }, { include_blank: true }) %>
Content Type: <%= select("cluster_content_type", "cluster_content_type", ClusterContentType.all.map {|a| [a.cluster_content_type, a.id] }, { include_blank: true }) %>
<br><br>
<%= submit_tag 'Filter' %>
<br><br>
</div>
<% end %>
2.5. Erro
Error when "Filter" submit button
ActionController::ParameterMissing in ClusterConfigsController#create
param is missing or the value is empty: cluster_config
Extracted source (around line #73):
72: def cluster_config_params
73: params.require(:cluster_config).permit(:cluster_status_id, :cluster_environment_type_id, :cluster_content_type_id, :url_rest_service, :db_host, :db_port, :db_name, :dt_created, :dt_delivered, :obs)
74: end
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"BF22bYvS/UXHOgeLLXeindCqWeXj41w/MxPE93cNoLBnaGwMhdC+HOuvvc6TCoteFHTsyyCZsoxO2j0kA4q/yA==",
"cluster_config"=>"",
"cluster_status"=>{"cluster_status"=>""},
"cluster_environment_type"=>{"cluster_environment_type"=>""},
"cluster_content_type"=>{"cluster_content_type"=>""},
"commit"=>"Filter"}
3. References
- http://www.justinweiss.com/articles/search-and-filter-rails-models-without-bloating-your-controller/
- https://stackoverflow.com/questions/6903339/rails-filter-index-page-and-re-display-filter-inputs
- https://stackoverflow.com/questions/19199994/rails-4-filter-index-via-collection-select-values-in-a-form-on-index-action
- https://stackoverflow.com/questions/6462956/rails-select-tag-setting-include-blank-and-selecting-a-default-value
Nenhum comentário:
Postar um comentário