module FileColumnHelper
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.
Public Instance Methods
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 %>
# File lib/file_column_helper.rb, line 25 def file_column_field(object, method, options={}) 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", options) end
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
.
# File lib/file_column_helper.rb, line 56 def url_for_file_column(object, method, options=nil, store_url_for_options={}) case object when String, Symbol object = instance_variable_get("@#{object.to_s}") end # parse options subdir = nil absolute = false if options case options when Hash subdir = options[:subdir] absolute = options[:absolute] when String, Symbol subdir = options end end context_path = absolute ? get_relative_url_for_rails(Rails::VERSION::MAJOR) : nil object.send("#{method}_download_url", context_path, subdir, store_url_for_options) end
Private Instance Methods
# File lib/file_column_helper.rb, line 81 def get_relative_url_for_rails(rails_version) (rails_version == 2 ? ActionController::Base.relative_url_root : Rails.application.config.action_controller.relative_url_root).to_s end