Module: FileColumnHelper

Included in:
ActionView::Helpers
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

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, 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

#url_for_file_column(object, method, options = nil, store_url_for_options = {}) ⇒ 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
# 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