Display the active filter using has_scope gem Rails


Display the active filter using has_scope gem Rails
I have a Entry model that has_many courses through entry_courses (has_many through association). I've set up my scope as such in my entry.rb (model)
scope :by_courses, -> (ids_ary)
joins(entry_courses: :course).where("courses.id" => ids_ary)
Using this, I'm able to filter using a URL
http://localhost:3000/entries?by_courses=5
This filters the proper entries with course_id = 5
.
course_id = 5
So, my question is, how can I display the active filter (course name) at the top of the index.html.erb view when that param is passed in the URL?
Model
class Entry < ApplicationRecord
mount_uploader :attachment, AttachmentUploader
has_many :entry_topics
has_many :topics, through: :entry_topics
has_many :entry_categories
has_many :categories, through: :entry_categories
has_many :entry_courses
has_many :courses, through: :entry_courses
belongs_to :user
scope :by_categories, ->(ids_ary) joins(entry_categories: :category).where("categories.id" => ids_ary)
scope :by_topics, ->(ids_ary) joins(entry_topics: :topic).where("topics.id" => ids_ary)
scope :by_level, -> level where(:level => level)
scope :by_courses, -> (ids_ary) joins(entry_courses: :course).where("courses.id" => ids_ary)
end
Controller
class EntriesController < ApplicationController
before_action :set_entry, only: [:show, :edit, :update, :destroy]
before_action :set_variables, only: [:new, :create, :show, :edit, :update, :index]
before_action :authenticate_user!, only: [:new, :create, :edit, :update]
before_action :user_is_current_user, only: [:edit, :update, :destroy]
has_scope :by_categories, type: :array
has_scope :by_level, type: :array
has_scope :by_topics, type: :array
has_scope :by_courses, type: :array
# GET /entries
# GET /entries.json
def index
@entries = if params[:term]
Entry.where('title ILIKE ?', "%#params[:term]%")
else
@entries = apply_scopes(Entry.order(:created_at => 'DESC'))
end
end
# GET /entries/1
# GET /entries/1.json
def show
end
# GET /entries/new
def new
@entry = Entry.new(:user => @current_user)
end
# GET /entries/1/edit
def edit
end
# POST /entries
# POST /entries.json
def create
@entry = Entry.new(entry_params)
@entry.user_id = current_user.id
respond_to do |format|
if @entry.save
format.html redirect_to @entry, notice: 'Entry was successfully created.'
format.json render :show, status: :created, location: @entry
else
format.html render :new
format.json render json: @entry.errors, status: :unprocessable_entity
end
end
end
# PATCH/PUT /entries/1
# PATCH/PUT /entries/1.json
def update
user = User.find_by_id(@entry.user_id)
entry = @entry
respond_to do |format|
if @entry.update(entry_params)
format.html redirect_to @entry, notice: 'Entry was successfully updated.'
format.json render :show, status: :ok, location: @entry
else
format.html render :edit
format.json render json: @entry.errors, status: :unprocessable_entity
end
end
end
# DELETE /entries/1
# DELETE /entries/1.json
def destroy
@entry.destroy
respond_to do |format|
format.html redirect_to entries_url, notice: 'Entry was successfully destroyed.'
format.json head :no_content
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_entry
@entry = Entry.find(params[:id])
end
def set_variables
@categories = Category.all
@topics = Topic.all
@courses = Course.all
end
# Never trust parameters from the scary internet, only allow the white list through.
def entry_params
params.require(:entry).permit(topic_ids: , category_ids: , course_ids: , :description, :category_id, :title, :entry_type,:entry_type_other, :genre, :level, :course, :attachment, :remove_attachment, :entry_id, :user, :user_id, :id, :url_link, :term)
end
def user_is_current_user
unless current_user == @entry.user or current_user.admin?
redirect_to(root_url, alert: "Sorry! You can't edit this resource since you didn't create it.") and return
end
end
end
1 Answer
1
Using current_scopes
in your view will return a hash of by_courses: 5
or similar.
current_scopes
by_courses: 5
how can I display the active filter (course name)
In application_helper.rb
def entries_name
scope = current_scope.first
model = entries_scope_map[scope[0]]
model.find(scope[1][0]).name
end
def entries_scope_map
by_courses: Course
end
In your view (or similar):
<%= entries_name %>
current_scopes.keys.first
– Josh Brody
58 mins ago
current_scopes.keys.first
Hmm...that didn't work. It's just displaying by_courses now.
– chris
56 mins ago
Oops I misunderstood your question. See my edit for what I would do :)
– Josh Brody
52 mins ago
Thanks for your help so far, man! I've tried your solution above and it's still not working (just displaying "Course Name" and nothing else). To clarify, each course has an id (obviously) and a field called :name. Passing current_scopes successfully displays the ID (so I know the scope is working!), but I can't get the corresponding :name field to display instead of the ID.
– chris
45 mins ago
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Yes! That worked. However, is there any way I can display the name attribute instead of :by_courses=>["5"]
– chris
1 hour ago