简体   繁体   English

使用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). 我有一个Entry模型,它具有通过entry_courses(具有关联的has_many)的多个课程。 I've set up my scope as such in my entry.rb (model) 我已经在我的entry.rb(模型)中设置了范围

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 使用此功能,我可以使用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? 因此,我的问题是,当URL中传递该参数时,如何在index.html.erb视图的顶部显示活动过滤器(课程名称)?

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

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 在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 %> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM