1

Rails 4.0.0 アプリがあり、has_scope gem を含めたいと考えています。

非常にシンプルでストレートなリソース:

モデル:

  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)}

コントローラ:

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 は常に空のハッシュであり、適用されるスコープに関係なく Thing.all がビューに渡されます。スコープ自体は問題なく、フィルタリングされたレコードを適切に返します パラメータは次のとおりです。

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"}

この設定の何が問題なのですか。警告もメソッドの欠落もありません。すべてのリストだけです。構成オプションか何かを見逃しましたか?

この場合、スコープはテーブルの列で機能します。これで修正されます:

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

そしてより

has_scope :by_client

およびパラメータ

{"by_client"=>"113"}

十分です

4

1 に答える 1

2

ドキュメントを読んだ簡単な内容に基づいてhas_scope、指定したパラメーターが間違っているため、次のように変更する必要があります。

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

そして、コントローラーはに変更する必要がありhas_scopeます

has_scope :by_client, :using => :client, :type => :integer
于 2014-07-26T14:23:46.110 に答える