# 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.
module FileColumnHelper
# 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):
#
#
#
#
# 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 %>
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+.
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
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
end