Ruby on rails 如何在不从ActiveRecord::Base继承的类中使用用于Rails的回形针gem?

Ruby on rails 如何在不从ActiveRecord::Base继承的类中使用用于Rails的回形针gem?,ruby-on-rails,paperclip,activemodel,Ruby On Rails,Paperclip,Activemodel,似乎有一些人通过如下操作在常规ruby类上使用回形针: require "paperclip" Class Person include Paperclip has_attached_file :avatar,{} end <%= form_for Importer.new, :url => import_nuts_path do |form| %> <%= form.file_field 'import_file' %> <%=

似乎有一些人通过如下操作在常规ruby类上使用回形针:

require "paperclip"

Class Person
   include Paperclip
   has_attached_file :avatar,{}
end
<%= form_for Importer.new, :url => import_nuts_path do |form| %>
   <%= form.file_field 'import_file' %>
   <%= form.submit 'Upload and Import' %>
<% end %>
看 即使在使用主回形针回购时,这也不适用于我:

$ bundle exec rails c
>> Rails.version
=> "3.1.3"
>> require 'paperclip'
=> false
>> class Monkey
>> include Paperclip
>> has_attached_file :avatar,{}
>> end
NoMethodError: undefined method `has_attached_file' for Monkey:Class
有没有人能做到这一点,并能给出一个可能出现问题的线索


谢谢

回形针非常明确地用于AR

另一种选择是使用载波,它在AR之外工作得很好,有多种ORM,或者没有:


我最近不得不弄明白这一点。在定义库类或模型时,需要使用一些ActiveModel的东西。具体地说,要使用回形针,您需要以下方法:保存、销毁、它们的回调、to_key(与表单一起使用)、attr_acessor for id,当然还有*_file_name、*_file_size、*_content_type、*_updated_at,用于每个附加文件

下面的类应该为您提供所需的最低实现。截至2012年9月10日,该“解决方案”使用Rails 3.2.8、Ruby 1.9.3和曲别针3.2.0,尽管其他配置也可以使用

class Importer
    extend  ActiveModel::Callbacks
    include ActiveModel::Validations

    include Paperclip::Glue

    define_model_callbacks :save
    define_model_callbacks :destroy

    validate :no_attachement_errors

    attr_accessor :id, :import_file_file_name, :import_file_file_size, :import_file_content_type, :import_file_updated_at

    has_attached_file :import_file,
                      :path => ":rails_root/public/system/:attachment/:id/:style/:filename",
                      :url  => "/system/:attachment/:id/:style/:filename"

    def initialize(args = { })
      args.each_pair do |k, v|
        self.send("#{k}=", v)
      end
      @id = self.class.next_id
    end

    def update_attributes(args = { })
      args.each_pair do |k, v|
        self.send("#{k}=", v)
      end
    end

    def save
       run_callbacks :save do
       end
    end

    def destroy
      run_callbacks :destroy do
      end
    end

    # Needed for using form_for Importer::new(), :url => ..... do
    def to_key
      [:importer]
    end

    # Need a differentiating id for each new Importer.
    def self.next_id
      @@id_counter += 1
    end

    # Initialize beginning id to something mildly unique.
    @@id_counter = Time.now.to_i

  end
文件上载的表单可能如下所示:

require "paperclip"

Class Person
   include Paperclip
   has_attached_file :avatar,{}
end
<%= form_for Importer.new, :url => import_nuts_path do |form| %>
   <%= form.file_field 'import_file' %>
   <%= form.submit 'Upload and Import' %>
<% end %>
import_nuts_path do|form|%>
NutsController将执行以下操作:

class NutsController < ActionController::Base
    def import
       importer = Importer.new(params[:importer])
       importer.save
    end
end
class NutsController
注意::您必须调用“保存”,否则将什么也不会发生。调用“销毁”将删除服务器端的文件。因为这个类不是持久性的,所以您可能应该在控制器中使用它之后再这样做,否则如果不进行任何清理,您将导致文件空间泄漏

安全注意事项:此“解决方案”未对new()和update_attributes()使用任何ActiveModel::MassaSignmentSecurity,但此类实际上并不需要它。您的里程可能会有所不同。外面要小心

干杯,

-Polar博士

载波看起来真的很不错,但人们似乎已经在AR之外使用了回形针。我可能会使用载波,以避免将来出现回形针的主要目标是AR的任何并发症。我同意-一切都是可能的,我相信这是可以做到的。我想你可能会带着这种回形针游到上游去。