1

次のSiteable懸念があります。

module Siteable
  extend ActiveSupport::Concern

  included do
    belongs_to :site

    scope :by_site,  lambda { |site| where(site_id: site.try(:id)) }
    scope :for_site, lambda { |site| by_site self.class.by_site(site).any? ? site : nil }
  end
end

この懸念のあるモデルの例:

class IndustryLink < LinkResource
  require 'concerns/siteable.rb'
  include Siteable

  belongs_to :author, :class_name => 'User'
  belongs_to :industry
  validates_presence_of :name, :link
end

サーバー上で正常に動作します。しかし、このモデルのすべてのスペックは同様のエラーで失敗します:

 Failure/Error: industry = Factory(:industry, :name => 'new industry')
 NoMethodError:
   undefined method `by_site' for Class:Class
 # ./app/models/concerns/siteable.rb:8:in `block (2 levels) in <module:Siteable>'
 # ./app/models/industry_link.rb:12:in `get_objects'
 # ./app/models/concerns/reorderable.rb:47:in `add_number'
 # ./spec/views/sitemap/show.xml.builder_spec.rb:41:in `block (2 levels) in <top (required)>'

したがって、明らかにこの場合でself.classはなくIndustry、これを修正する方法がわかりません。

for_siteがモデルに移動して仕様に変更self.classすると、Industry合格します。

Ruby 1.9.3、2.1.1、Rails 3.2.19 を確認済み

4

1 に答える 1

1

あなたのラムダ内で self はすでにモデルクラス -であるIndustryため、self.classClass

使用by_siteする必要があります(必要なものに応じて、最初にスコープを解除する可能性があります)

于 2014-09-05T07:25:58.473 に答える