ruby - 扩展 ruby​​ 特征类以加载 CarrierWave

标签 ruby ruby-on-rails-3 activerecord carrierwave dci

更新:我简化了我的问题;您可以通过查看 my editing revisions 查看完整的历史记录.感谢iainbernardk让我走到这一步。


我想将载波功能加载到我的 User < ActiveRecord::Base 的实例中模型。

require 'uploaders/avatar_uploader'

module HasAnAvatar
  def self.extended(host)
    if host.class == Class
      mount_uploader :avatar, AvatarUploader
    else
      class << host
        mount_uploader :avatar, AvatarUploader
      end
    end
  end
end

执行:

(user = User.first).extend(HasAnAvatar).avatar

结果:

NoMethodError: undefined method new' for nil:NilClass from /Users/evan/.rbenv/versions/1.9.3-p286/lib/ruby/gems/1.9.1/gems/carrierwave-0.6.2/lib/carrierwave/mount.rb:306:in uploader'

我怀疑问题出在 mount_uploaderHasAnAvatar未在 user 的特征类上正确调用, 这样 the uploaders hash isn't populated .

关于如何让它工作有什么想法吗?


这是针对此问题的示例 Rails 应用程序:https://github.com/neezer/extend_with_avatar_example

最佳答案

这里有两种方法可以将模块包含到实例中(基本上是扩展实例的特征类)。我认为这不是您问题的最佳答案,即使它可以(部分)回答问题。

class A
end
# => nil

module B
  def blah
    "Blah!"
  end
end
# => nil

a = A.new
=> #<A:0x0000010086cdf0>

a.blah
# NoMethodError: undefined method `blah' for #<A:0x0000010086cdf0>

class << a
  include B
end

a.blah
# => "Blah!"

b = A.new
# => #<A:0x0000010083b818>

b.blah
# NoMethodError: undefined method `blah' for #<A:0x0000010083b818>

b.extend B
# => #<A:0x0000010083b818>

b.blah
# => "Blah!"

c.blah
# NoMethodError: undefined method `blah' for #<A:0x0000010085eed0>

来自您的编辑:

module Pacifiable
  def pacified_with(mechanism)
    class_eval do
      define_method(:"pacified_with_#{mechanism}?") { true }
    end
  end
end
# => nil

class JellyFish
  define_method(:is_squishy?) { true }
end
# => #<Proc:0x00000100850448@(irb):10 (lambda)>

class Lobster
  extend Pacifiable
  pacified_with :polar_bear
  define_method(:is_squishy?) { false }
end
# => #<Proc:0x00000100960540@(irb):16 (lambda)>

lobster = Lobster.new
# => #<Lobster:0x0000010095aa50>

lobster.pacified_with_polar_bear?
# => true

jelly = JellyFish.new
# => #<JellyFish:0x00000100951108>

jelly.pacified_with_polar_bear?
# NoMethodError: undefined method `pacified_with_polar_bear?' for #<JellyFish:0x00000100951108>

class << jelly
    extend Pacifiable
    pacified_with :polar_bear
  end
# => #<Proc:0x0000010093ddd8@(irb):4 (lambda)>

jelly.pacified_with_polar_bear?
# => true

big_jelly = JellyFish.new
# => #<JellyFish:0x0000010091ad38>

big_jelly.pacified_with_polar_bear?
# NoMethodError: undefined method `pacified_with_polar_bear?' for #<JellyFish:0x0000010091ad38>

关于ruby - 扩展 ruby​​ 特征类以加载 CarrierWave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14170344/

相关文章:

arrays - 使用转置从列中删除 'nil'

ruby - 使用 Puma 的工作线程、线程和池大小

ruby - 如何在没有 nilcheck 的情况下将 nil 值转换为 true

ruby-on-rails - Capistrano 部署到同一服务器上的不同路径

mysql - Rails 错误地转义了我的查询

ruby-on-rails - Rails ActiveRecord 不将时间转换为 UTC,而是将未转换的时间保存为 UTC

ruby - 使用键、值和索引作为 block 参数减少散列

ruby-on-rails - RoR3 : 1) how to return specific field on query? 上的 Mongoid 2) 需要什么 inverse_of?

ruby-on-rails - Rails actionmailer,在特定时间发送邮件

ruby-on-rails - belongs_to 关联的 Rails 作用域