Module: FileColumnHelper
- Included in:
- ActionView::Base
- Defined in:
- lib/file_column_helper.rb
Overview
This module contains helper methods for displaying and uploading files for attributes created by FileColumn
‘s file_column
method. It will be automatically included into ActionView::Base, thereby making this module’s methods available in all your views.
Instance Method Summary collapse
-
#file_column_field(object, method, options = {}) ⇒ Object
Use this helper to create an upload field for a file_column attribute.
-
#url_for_file_column(object, method, options = nil) ⇒ Object
Creates an URL where an uploaded file can be accessed.
-
#url_for_image_column(object, method, options = nil) ⇒ Object
Same as
url_for_file_colum
but allows you to access different versions of the image that have been processed by RMagick.
Instance Method Details
#file_column_field(object, method, options = {}) ⇒ Object
Use this helper to create an upload field for a file_column attribute. This will generate an additional hidden field to keep uploaded files during form-redisplays. For example, when called with
<%= file_column_field("entry", "image") %>
the following HTML will be generated (assuming the form is redisplayed and something has already been uploaded):
<input type="hidden" name="entry[image_temp]" value="..." />
<input type="file" name="entry[image]" />
You can use the option
argument to pass additional options to the file-field tag.
Be sure to set the enclosing form’s encoding to ‘multipart/form-data’, by using something like this:
<%= form_tag {:action => "create", ...}, :multipart => true %>
25 26 27 28 |
# File 'lib/file_column_helper.rb', line 25 def file_column_field(object, method, ={}) result = ActionView::Helpers::InstanceTag.new(object.dup, method.to_s+"_temp", self).to_input_field_tag("hidden", {}) result << ActionView::Helpers::InstanceTag.new(object.dup, method, self).to_input_field_tag("file", ) end |
#url_for_file_column(object, method, options = nil) ⇒ Object
Creates an URL where an uploaded file can be accessed. When called for an Entry object with id 42 (stored in @entry
) like this
<%= url_for_file_column(@entry, "image")
the following URL will be produced, assuming the file “test.png” has been stored in the “image”-column of an Entry object stored in @entry
:
/entry/image/42/test.png
This will produce a valid URL even for temporary uploaded files, e.g. files where the object they are belonging to has not been saved in the database yet.
The URL produces, although starting with a slash, will be relative to your app’s root. If you pass it to one rails’ image_tag
helper, rails will properly convert it to an absolute URL. However, this will not be the case, if you create a link with the link_to
helper. In this case, you can pass :absolute => true
to options
, which will make sure, the generated URL is absolute on your server. Examples:
<%= image_tag url_for_file_column(@entry, "image") %>
<%= link_to "Download", url_for_file_column(@entry, "image", :absolute => true) %>
If there is currently no uploaded file stored in the object’s column this method will return nil
.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/file_column_helper.rb', line 56 def url_for_file_column(object, method, =nil) case object when String, Symbol object = instance_variable_get("@#{object.to_s}") end # parse options subdir = nil absolute = false if case when Hash subdir = [:subdir] absolute = [:absolute] when String, Symbol subdir = end end relative_path = object.send("#{method}_relative_path", subdir) return nil unless relative_path url = "" url << ActionController::Base.relative_url_root.to_s if absolute url << "/" url << object.send("#{method}_options")[:base_url] << "/" url << relative_path end |
#url_for_image_column(object, method, options = nil) ⇒ Object
Same as url_for_file_colum
but allows you to access different versions of the image that have been processed by RMagick.
If your options
parameter is non-nil this will access a different version of an image that will be produced by RMagick. You can use the following types for options
:
-
a
:symbol
will select a version defined in the model via FileColumn::Magick’s:versions
feature. -
a
geometry_string
will dynamically create an image resized as specified bygeometry_string
. The image will be stored so that it does not have to be recomputed the next time the same version string is used. -
some_hash
will dynamically create an image that is created according to the options insome_hash
. This accepts exactly the same options as Magick’s version feature.
The version produced by RMagick will be stored in a special sub-directory. The directory’s name will be derived from the options you specified (via a hash function) but if you want to set it yourself, you can use the :name => name
option.
Examples:
<%= url_for_image_column @entry, "image", "640x480" %>
will produce an URL like this
/entry/image/42/bdn19n/filename.jpg
# "640x480".hash.abs.to_s(36) == "bdn19n"
and
<%= url_for_image_column @entry, "image",
:size => "50x50", :crop => "1:1", :name => "thumb" %>
will produce something like this:
/entry/image/42/thumb/filename.jpg
Hint: If you are using the same geometry string / options hash multiple times, you should define it in a helper to stay with DRY. Another option is to define it in the model via FileColumn::Magick’s :versions
feature and then refer to it via a symbol.
The URL produced by this method is relative to your application’s root URL, although it will start with a slash. If you pass this URL to rails’ image_tag
helper, it will be converted to an absolute URL automatically. If there is currently no image uploaded, or there is a problem while loading the image this method will return nil
.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/file_column_helper.rb', line 135 def url_for_image_column(object, method, =nil) case object when String, Symbol object = instance_variable_get("@#{object.to_s}") end subdir = nil if subdir = object.send("#{method}_state").create_magick_version_if_needed() end if subdir.nil? nil else url_for_file_column(object, method, subdir) end end |