attachable 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README +39 -0
- data/Rakefile +1 -0
- data/attachable.gemspec +20 -0
- data/init.rb +3 -0
- data/install.rb +1 -0
- data/lib/attachable.rb +65 -0
- data/lib/attachable/version.rb +3 -0
- data/test/attachable_test.rb +8 -0
- data/test/test_helper.rb +3 -0
- data/uninstall.rb +1 -0
- metadata +62 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Attachable
|
2
|
+
==========
|
3
|
+
|
4
|
+
A really simple file attachment plugin for Rails 3. Designed to work with any generic files, i.e not specific to images.
|
5
|
+
It will not do any magical processing for you, it just stores the data in the database. Write your own magic.
|
6
|
+
|
7
|
+
|
8
|
+
Usage
|
9
|
+
=======
|
10
|
+
|
11
|
+
Add the following fields to your table:
|
12
|
+
|
13
|
+
add_column :medias, :file_name, :string
|
14
|
+
add_column :medias, :file_type, :string
|
15
|
+
add_column :medias, :file_size, :integer
|
16
|
+
add_column :medias, :file_data, :binary, :limit => 2.megabytes
|
17
|
+
|
18
|
+
In your model:
|
19
|
+
class Media < ActiveRecord::Base
|
20
|
+
attachable
|
21
|
+
end
|
22
|
+
|
23
|
+
In a controller that should be able to view the result:
|
24
|
+
class MediasController < ApplicationController
|
25
|
+
def show
|
26
|
+
@media = Media(params[:id])
|
27
|
+
send_data @media.file_contents, :filename => @media.file_name, :type => @media.file_type, :disposition => 'inline'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
To upload, just set the form field to :file AND remember the multipart => true bit like shown:
|
32
|
+
<% form_for(@media, :html => { :multipart => true }) do |f| %>
|
33
|
+
<%= f.file_field :file %>
|
34
|
+
....more stuff....
|
35
|
+
|
36
|
+
|
37
|
+
In theory you can change the prefix from "file" to anything by setting the file_prefix option in the model, but I haven't tested it.
|
38
|
+
|
39
|
+
Copyright (c) 2010 Brian Michalski, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/attachable.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "attachable/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "attachable"
|
7
|
+
s.version = Attachable::VERSION
|
8
|
+
s.authors = ["Brian Michalski"]
|
9
|
+
s.email = ["bmichalski@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/bamnet/attachable"
|
11
|
+
s.summary = %q{A simple set of extensions to support files in a model}
|
12
|
+
s.description = %q{Add methods to automatically manage a file as part of a Rails model}
|
13
|
+
|
14
|
+
s.rubyforge_project = "attachable"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
end
|
data/init.rb
ADDED
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
data/lib/attachable.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# Attachable
|
2
|
+
require 'attachable/version'
|
3
|
+
require 'active_record'
|
4
|
+
require 'action_controller'
|
5
|
+
|
6
|
+
# Attachable provides simple file upload handlers for Rails 3 models.
|
7
|
+
module Attachable
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
# Loads the attachable methods, scope, and config into the model.
|
12
|
+
def attachable(options = {})
|
13
|
+
# Store the default prefix for file data
|
14
|
+
# Defaults to "file"
|
15
|
+
cattr_accessor :attachment_file_prefix
|
16
|
+
self.attachment_file_prefix = (options[:file_prefix] || :file).to_s
|
17
|
+
|
18
|
+
# Setup the default scope so the file data isn't included by default
|
19
|
+
send :default_scope, attachable_scope
|
20
|
+
|
21
|
+
# Include all the important stuff
|
22
|
+
send :include, InstanceMethods
|
23
|
+
end
|
24
|
+
|
25
|
+
# Generate the default scope, which includes every column except for the data column.
|
26
|
+
# We use this so queries, by default, don't include the file data which could be quite large.
|
27
|
+
def attachable_scope
|
28
|
+
select(column_names.reject { |n| n == "#{attachment_file_prefix}_data" }.collect {|n| "#{table_name}.#{n}" }.join(','))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module InstanceMethods
|
33
|
+
|
34
|
+
# Read the file data back from where ever it is stored. Uses a cached copy if it exists.
|
35
|
+
# If the cached attribute doens't exist, it reloads the model to get it
|
36
|
+
def file_contents
|
37
|
+
#Try to hit the cache, reload if it fails
|
38
|
+
if !attribute_present?("#{attachment_file_prefix}_data")
|
39
|
+
reload :select => "#{attachment_file_prefix}_data"
|
40
|
+
end
|
41
|
+
send("#{attachment_file_prefix}_data")
|
42
|
+
end
|
43
|
+
|
44
|
+
# Take in a UploadFile and copy it's properties to four fields,
|
45
|
+
# data, size, original filename. An UploadFile wraps a Tempfile,
|
46
|
+
# but includes some extra data (like the original filename and
|
47
|
+
# content type). We can't garuntee this file to be at the beginning,
|
48
|
+
# so we always rewind it.
|
49
|
+
def file=(tempfile)
|
50
|
+
tempfile.rewind #This may not be super efficient, but it's the necessary fix for Rails 3.1
|
51
|
+
self["#{attachment_file_prefix}_data"] = tempfile.read
|
52
|
+
self["#{attachment_file_prefix}_size"] = tempfile.size
|
53
|
+
self["#{attachment_file_prefix}_name"] = tempfile.original_filename
|
54
|
+
self["#{attachment_file_prefix}_type"] = tempfile.content_type
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
# Rails 3 compatability?
|
61
|
+
if defined? Rails
|
62
|
+
ActiveRecord::Base.class_eval do
|
63
|
+
extend Attachable::ClassMethods
|
64
|
+
end
|
65
|
+
end
|
data/test/test_helper.rb
ADDED
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: attachable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Brian Michalski
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-22 00:00:00.000000000 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
description: Add methods to automatically manage a file as part of a Rails model
|
16
|
+
email:
|
17
|
+
- bmichalski@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- Gemfile
|
24
|
+
- MIT-LICENSE
|
25
|
+
- README
|
26
|
+
- Rakefile
|
27
|
+
- attachable.gemspec
|
28
|
+
- init.rb
|
29
|
+
- install.rb
|
30
|
+
- lib/attachable.rb
|
31
|
+
- lib/attachable/version.rb
|
32
|
+
- test/attachable_test.rb
|
33
|
+
- test/test_helper.rb
|
34
|
+
- uninstall.rb
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: https://github.com/bamnet/attachable
|
37
|
+
licenses: []
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project: attachable
|
56
|
+
rubygems_version: 1.6.2
|
57
|
+
signing_key:
|
58
|
+
specification_version: 3
|
59
|
+
summary: A simple set of extensions to support files in a model
|
60
|
+
test_files:
|
61
|
+
- test/attachable_test.rb
|
62
|
+
- test/test_helper.rb
|