Class: ActionView::Helpers::InstanceTag

Inherits:
Object
  • Object
show all
Includes:
DateHelper, FormOptionsHelper, TagHelper
Defined in:
lib/action_view/helpers/date_helper.rb,
lib/action_view/helpers/form_helper.rb,
lib/action_view/helpers/form_options_helper.rb,
lib/action_view/helpers/active_record_helper.rb

Overview

:nodoc:

Constant Summary collapse

DEFAULT_FIELD_OPTIONS =
{ "size" => 30 }
DEFAULT_TEXT_AREA_OPTIONS =
{ "wrap" => "virtual", "cols" => 40, "rows" => 20 }

Constants included from FormOptionsHelper

FormOptionsHelper::COUNTRIES

Constants included from DateHelper

DateHelper::DEFAULT_PREFIX

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from FormOptionsHelper

#collection_select, #country_options_for_select, #country_select, #option_groups_from_collection_for_select, #options_for_select, #options_from_collection_for_select, #select, #time_zone_options_for_select, #time_zone_select

Methods included from DateHelper

#date_select, #datetime_select, #distance_of_time_in_words, #distance_of_time_in_words_to_now, #select_date, #select_datetime, #select_day, #select_hour, #select_minute, #select_month, #select_second, #select_time, #select_year

Constructor Details

#initialize(object_name, method_name, template_object, local_binding = nil) ⇒ InstanceTag

Returns a new instance of InstanceTag.



142
143
144
145
146
147
148
# File 'lib/action_view/helpers/form_helper.rb', line 142

def initialize(object_name, method_name, template_object, local_binding = nil)
  @object_name, @method_name = object_name, method_name
  @template_object, @local_binding = template_object, local_binding
  if @object_name.sub!(/\[\]$/,"")
    @auto_index = @template_object.instance_variable_get("@#{Regexp.last_match.pre_match}").id
  end
end

Instance Attribute Details

#method_nameObject (readonly)

Returns the value of attribute method_name.



137
138
139
# File 'lib/action_view/helpers/form_helper.rb', line 137

def method_name
  @method_name
end

#object_nameObject (readonly)

Returns the value of attribute object_name.



137
138
139
# File 'lib/action_view/helpers/form_helper.rb', line 137

def object_name
  @object_name
end

Instance Method Details

#column_typeObject



185
186
187
# File 'lib/action_view/helpers/active_record_helper.rb', line 185

def column_type
  object.send("column_for_attribute", @method_name).type
end

#content_tag(name, value, options) ⇒ Object



151
152
153
154
155
156
157
# File 'lib/action_view/helpers/active_record_helper.rb', line 151

def (name, value, options)
  if object.respond_to?("errors") && object.errors.respond_to?("on")
    error_wrapping((name, value, options), object.errors.on(@method_name))
  else
    (name, value, options)
  end
end

#content_tag_without_error_wrappingObject



150
# File 'lib/action_view/helpers/active_record_helper.rb', line 150

alias_method :content_tag_without_error_wrapping, :content_tag

#error_messageObject



181
182
183
# File 'lib/action_view/helpers/active_record_helper.rb', line 181

def error_message
  object.errors.on(@method_name)
end

#error_wrapping(html_tag, has_error) ⇒ Object



177
178
179
# File 'lib/action_view/helpers/active_record_helper.rb', line 177

def error_wrapping(html_tag, has_error)
  has_error ? Base.field_error_proc.call(html_tag, self) : html_tag
end

#objectObject



203
204
205
# File 'lib/action_view/helpers/form_helper.rb', line 203

def object
  @template_object.instance_variable_get "@#{@object_name}"
end

#tag(name, options) ⇒ Object



142
143
144
145
146
147
148
# File 'lib/action_view/helpers/active_record_helper.rb', line 142

def tag(name, options)
  if object.respond_to?("errors") && object.errors.respond_to?("on")
    error_wrapping(tag_without_error_wrapping(name, options), object.errors.on(@method_name))
  else
    tag_without_error_wrapping(name, options)
  end
end

#tag_without_error_wrappingObject



141
# File 'lib/action_view/helpers/active_record_helper.rb', line 141

alias_method :tag_without_error_wrapping, :tag

#to_boolean_select_tag(options = {}) ⇒ Object



192
193
194
195
196
197
198
199
200
201
# File 'lib/action_view/helpers/form_helper.rb', line 192

def to_boolean_select_tag(options = {})
  add_default_name_and_id(options)
  tag_text = "<select"
  tag_text << tag_options(options)
  tag_text << "><option value=\"false\""
  tag_text << " selected" if value == false
  tag_text << ">False</option><option value=\"true\""
  tag_text << " selected" if value
  tag_text << ">True</option></select>"
end

#to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0") ⇒ Object



175
176
177
178
179
180
# File 'lib/action_view/helpers/form_helper.rb', line 175

def to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0")
  options.merge!({ "checked" => "checked" }) if !value.nil? && ((value.is_a?(TrueClass) || value.is_a?(FalseClass)) ? value : value.to_i > 0)
  options.merge!({ "type" => "checkbox", "value" => checked_value })
  add_default_name_and_id(options)
  tag("input", options) << tag("input", ({ "name" => options['name'], "type" => "hidden", "value" => unchecked_value }))
end

#to_collection_select_tag(collection, value_method, text_method, options, html_options) ⇒ Object



271
272
273
274
275
276
# File 'lib/action_view/helpers/form_options_helper.rb', line 271

def to_collection_select_tag(collection, value_method, text_method, options, html_options)
  add_default_name_and_id(html_options)
  (
    "select", add_blank_option(options_from_collection_for_select(collection, value_method, text_method, value), options[:include_blank]), html_options
  )
end

#to_country_select_tag(priority_countries, options, html_options) ⇒ Object



278
279
280
281
# File 'lib/action_view/helpers/form_options_helper.rb', line 278

def to_country_select_tag(priority_countries, options, html_options)
  add_default_name_and_id(html_options)
  ("select", add_blank_option(country_options_for_select(value, priority_countries), options[:include_blank]), html_options)
end

#to_date_select_tag(options = {}) ⇒ Object



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# File 'lib/action_view/helpers/date_helper.rb', line 218

def to_date_select_tag(options = {})
  defaults = { :discard_type => true }
  options  = defaults.merge(options) 
  options_with_prefix = Proc.new { |position| options.update({ :prefix => "#{@object_name}[#{@method_name}(#{position}i)]" }) }
  date     = options[:include_blank] ? (value || 0) : (value || Date.today)

  date_select = ""
  
  if options[:month_before_year] # For backwards compatibility
    options[:order] = [:month, :year, :day]
  end

  options[:order] ||= [:year, :month, :day]

  position = {:year => 1, :month => 2, :day => 3}
  
  discard = {}
  discard[:year]  = true if options[:discard_year]
  discard[:month] = true if options[:discard_month]
  discard[:day]   = true if options[:discard_day] or options[:discard_month]
  
  options[:order].each do |param|
    date_select << self.send("select_#{param}", date, options_with_prefix.call(position[param])) unless discard[param]
  end

  return date_select
end

#to_date_select_tag_without_error_wrappingObject



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/action_view/helpers/active_record_helper.rb', line 159

def to_date_select_tag(options = {})
  defaults = { :discard_type => true }
  options  = defaults.merge(options) 
  options_with_prefix = Proc.new { |position| options.update({ :prefix => "#{@object_name}[#{@method_name}(#{position}i)]" }) }
  date     = options[:include_blank] ? (value || 0) : (value || Date.today)

  date_select = ""
  
  if options[:month_before_year] # For backwards compatibility
    options[:order] = [:month, :year, :day]
  end

  options[:order] ||= [:year, :month, :day]

  position = {:year => 1, :month => 2, :day => 3}
  
  discard = {}
  discard[:year]  = true if options[:discard_year]
  discard[:month] = true if options[:discard_month]
  discard[:day]   = true if options[:discard_day] or options[:discard_month]
  
  options[:order].each do |param|
    date_select << self.send("select_#{param}", date, options_with_prefix.call(position[param])) unless discard[param]
  end

  return date_select
end

#to_date_tagObject



182
183
184
185
186
187
188
189
190
# File 'lib/action_view/helpers/form_helper.rb', line 182

def to_date_tag()
  defaults = { "discard_type" => true }
  date     = value || Date.today
  options  = Proc.new { |position| defaults.update({ :prefix => "#{@object_name}[#{@method_name}(#{position}i)]" }) }

  html_day_select(date, options.call(3)) +
  html_month_select(date, options.call(2)) + 
  html_year_select(date, options.call(1))
end

#to_datetime_select_tag(options = {}) ⇒ Object



246
247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/action_view/helpers/date_helper.rb', line 246

def to_datetime_select_tag(options = {})
  defaults = { :discard_type => true }
  options  = defaults.merge(options) 
  options_with_prefix = Proc.new { |position| options.update({ :prefix => "#{@object_name}[#{@method_name}(#{position}i)]" }) }
  datetime = options[:include_blank] ? (value || 0) : (value || Time.now)

  datetime_select  = select_year(datetime, options_with_prefix.call(1))
  datetime_select << select_month(datetime, options_with_prefix.call(2)) unless options[:discard_month]
  datetime_select << select_day(datetime, options_with_prefix.call(3)) unless options[:discard_day] || options[:discard_month]
  datetime_select << " &mdash; " + select_hour(datetime, options_with_prefix.call(4)) unless options[:discard_hour]
  datetime_select << " : " + select_minute(datetime, options_with_prefix.call(5)) unless options[:discard_minute] || options[:discard_hour]
  
  return datetime_select
end

#to_datetime_select_tag_without_error_wrappingObject



168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/action_view/helpers/active_record_helper.rb', line 168

def to_datetime_select_tag(options = {})
  defaults = { :discard_type => true }
  options  = defaults.merge(options) 
  options_with_prefix = Proc.new { |position| options.update({ :prefix => "#{@object_name}[#{@method_name}(#{position}i)]" }) }
  datetime = options[:include_blank] ? (value || 0) : (value || Time.now)

  datetime_select  = select_year(datetime, options_with_prefix.call(1))
  datetime_select << select_month(datetime, options_with_prefix.call(2)) unless options[:discard_month]
  datetime_select << select_day(datetime, options_with_prefix.call(3)) unless options[:discard_day] || options[:discard_month]
  datetime_select << " &mdash; " + select_hour(datetime, options_with_prefix.call(4)) unless options[:discard_hour]
  datetime_select << " : " + select_minute(datetime, options_with_prefix.call(5)) unless options[:discard_minute] || options[:discard_hour]
  
  return datetime_select
end

#to_input_field_tag(field_type, options = {}) ⇒ Object



150
151
152
153
154
155
156
157
158
# File 'lib/action_view/helpers/form_helper.rb', line 150

def to_input_field_tag(field_type, options = {})
  html_options = DEFAULT_FIELD_OPTIONS.merge(options)
  html_options.merge!({ "size" => options["maxlength"]}) if options["maxlength"] && !options["size"]
  html_options.delete("size") if field_type == "hidden"
  html_options.merge!({ "type" =>  field_type})
  html_options.merge!({ "value" => value_before_type_cast }) if options["value"].nil? && field_type != "file"
  add_default_name_and_id(html_options)
  tag("input", html_options)
end

#to_radio_button_tag(tag_value, options = {}) ⇒ Object



160
161
162
163
164
165
166
167
# File 'lib/action_view/helpers/form_helper.rb', line 160

def to_radio_button_tag(tag_value, options={})
  html_options = DEFAULT_FIELD_OPTIONS.merge(options)
  html_options.merge!({ "checked" => "checked" }) if value == tag_value
  html_options.merge!({ "type" => "radio", "value"=> tag_value.to_s })
                 
  add_default_name_and_id(html_options)
  tag("input", html_options)
end

#to_select_tag(choices, options, html_options) ⇒ Object



266
267
268
269
# File 'lib/action_view/helpers/form_options_helper.rb', line 266

def to_select_tag(choices, options, html_options)
  add_default_name_and_id(html_options)
  ("select", add_blank_option(options_for_select(choices, value), options[:include_blank]), html_options)
end

#to_tag(options = {}) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/action_view/helpers/active_record_helper.rb', line 123

def to_tag(options = {})
  case column_type
    when :string
      field_type = @method_name.include?("password") ? "password" : "text"
      to_input_field_tag(field_type, options)
    when :text
      to_text_area_tag(options)
    when :integer, :float
      to_input_field_tag("text", options)
    when :date
      to_date_select_tag(options)
    when :datetime
      to_datetime_select_tag(options)
    when :boolean
      to_boolean_select_tag(options)
  end
end

#to_text_area_tag(options = {}) ⇒ Object



169
170
171
172
173
# File 'lib/action_view/helpers/form_helper.rb', line 169

def to_text_area_tag(options = {})
  options = DEFAULT_TEXT_AREA_OPTIONS.merge(options)
  add_default_name_and_id(options)
  ("textarea", html_escape(value_before_type_cast), options)
end

#to_time_zone_select_tag(priority_zones, options, html_options) ⇒ Object



283
284
285
286
287
288
289
290
291
# File 'lib/action_view/helpers/form_options_helper.rb', line 283

def to_time_zone_select_tag(priority_zones, options, html_options)
  add_default_name_and_id(html_options)
  ("select",
    add_blank_option(
      time_zone_options_for_select(value, priority_zones, options[:model] || TimeZone),
      options[:include_blank]
    ), html_options
  )
end

#valueObject



207
208
209
# File 'lib/action_view/helpers/form_helper.rb', line 207

def value
  object.send(@method_name) unless object.nil?
end

#value_before_type_castObject



211
212
213
214
215
216
217
# File 'lib/action_view/helpers/form_helper.rb', line 211

def value_before_type_cast
  unless object.nil?
    object.respond_to?(@method_name + "_before_type_cast") ? 
      object.send(@method_name + "_before_type_cast") :
      object.send(@method_name)
  end
end