module BindUrl

Constants

BindUrlConfig
BucketConfig
VERSION

Attributes

default_binder_class[W]
storage_configs[RW]

Public Class Methods

configure(storage = :default) { |config| ... } click to toggle source
# File lib/bind_url.rb, line 82
def configure(storage = :default)
  config = BindUrl::BucketConfig.new
  yield config
  storage_configs[storage] = config
end
default_binder_class() click to toggle source
# File lib/bind_url.rb, line 88
def default_binder_class
  raise "you need overwrite BindUrl.default_binder_class" if @default_binder_class.nil?
  @default_binder_class
end

Public Instance Methods

bind_url(attr, binder_class: BindUrl.default_binder_class, private: false) click to toggle source
# File lib/bind_url.rb, line 9
  def bind_url(attr, binder_class: BindUrl.default_binder_class, private: false)
    bind_url_configs[attr.to_sym] = BindUrlConfig.new(binder_class: binder_class, private: private)

    self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
      def #{attr}_url(params = {})
        v = self.send(:#{attr})
        return nil unless v
        #{attr}_binder.gen_url(v, params)
      end

      def #{attr}_url=(url)
        self.send("#{attr}=", #{attr}_binder.upload_via_url(url))
      end

      def #{attr}_file=(file)
        self.send("#{attr}=", #{attr}_binder.upload_via_file(file))
      end

      def #{attr}_binder
        config = self.class.bind_url_configs[:#{attr}]
        config.binder_class.new(model: self, attr: :#{attr}, private: config.private)
      end
    RUBY
  end
bind_url_configs() click to toggle source
# File lib/bind_url.rb, line 74
def bind_url_configs
  @bind_url_configs ||= {}
end
bind_urls(attr, binder_class: BindUrl.default_binder_class, private: false) click to toggle source
# File lib/bind_url.rb, line 34
  def bind_urls(attr, binder_class: BindUrl.default_binder_class, private: false)
    bind_url_configs[attr.to_sym] = BindUrlConfig.new(binder_class: binder_class, private: private)

    signle_attr = attr.to_s.singularize.to_sym
    self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
      def #{signle_attr}_urls(params = {})
        vs = self.send(:#{attr})
        return [] if vs.nil?
        vs.map { |v| #{attr}_binder.gen_url(v, params) }.freeze
      end

      def #{signle_attr}_urls=(urls)
        vs = urls.map { |url| #{attr}_binder.upload_via_url(url) }
        self.send("#{attr}=", vs)
      end

      def #{signle_attr}_files=(files)
        vs = files.map { |f| #{attr}_binder.upload_via_file(f) }
        self.send("#{attr}=", vs)
      end

      def upload_#{signle_attr}_url(index, url)
        vs = self.send("#{attr}") || []
        vs[index] = #{attr}_binder.upload_via_url(url)
        self.send("#{attr}=", vs)
      end

      def upload_#{signle_attr}_file(index, file)
        vs = self.send("#{attr}") || []
        vs[index] = #{attr}_binder.upload_via_file(file)
        self.send("#{attr}=", vs)
      end

      def #{attr}_binder
        config = self.class.bind_url_configs[:#{attr}]
        config.binder_class.new(model: self, attr: :#{attr}, private: config.private)
      end
    RUBY
  end