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/

相关文章:

ruby-on-rails - Nginx 和 Passenger 用户权限。最佳实践?

ruby-on-rails-3 - 如何使继承的资源可选嵌套为单例?

ruby-on-rails - Errno::ECONNREFUSED:连接被拒绝 - connect(2) for action mailer

ruby-on-rails - rake 数据库 :setup or rake db:create applying wrong username/wrong database

ruby-on-rails - 删除记录之前不会出现确认弹出窗口

c# - 如何从 C# 解密 ruby​​ 中的 RijandelManaged?

javascript - Rails 使用 'read more' 切换 chop

ruby-on-rails - 如何删除 ActiveRecord 中具有相关记录的多条记录

ruby-on-rails - Rails : Virtual attributes and form values

ruby - 在 ubuntu 10.10 上使用 rvm 安装 ruby​​ 失败