Rails 4 with has_scope: fails silently

2019-05-31 22:29发布

问题:

I have a Rails 4.0.0 app and want to include the has_scope gem.

Very simple and straight resources:

Model:

  class Thing < ActiveRecord::Base
  resourcify
  ...
  belongs_to :client
  validates_presence_of :name
  scope :by_client, ->  client  { where(:client => client)}
  scope :by_name, -> name { where(:name => name)}

Controller:

class ThingsController < ApplicationController
  include Pundit
  before_filter :authenticate_user!
  before_action :set_thing, only: [:show, :edit, :update, :destroy]
  after_action :verify_authorized, :except => [:index, :edit]
  has_scope :by_client, :type => :integer
  has_scope :by_name
 ....

 def index
   @things = apply_scopes(Thing).all
   puts current_scopes        
 end 

current_scopes is always an empty hash and Thing.all is passed to the view, no matter what scope is applied. The scopes themself are ok and properly return the filtered records Parameters are there: eg:

Started GET "/things?client=113" for 127.0.0.1 at 2014-07-26 16:07:32 +0200
Processing by ThingsController#index as HTML
  Parameters: {"client"=>"113"}

What is wrong with this setup. I got no warnings, no method missing etc. Just the full list of things. Did i miss some configuration option or anything?

Got it, in this case, scope works on table colums. This fixes it:

scope :by_client, ->  client  { where(:client_id => client)} 

and than a

has_scope :by_client

and parameters

{"by_client"=>"113"}

are enough

回答1:

Based on the brief read I've had through the has_scope documentation, the parameters has you're supplying is wrong and needs to be changed to

{ "by_client" => { "client" => "113" } }

And your controller needs to change the has_scope to

has_scope :by_client, :using => :client, :type => :integer