Module: SignedForm::FormBuilder

Defined in:
lib/signed_form/form_builder.rb

Constant Summary collapse

FIELDS_TO_SIGN =
[:select, :collection_select, :grouped_collection_select,
:time_zone_select, :collection_radio_buttons, :collection_check_boxes,
:date_select, :datetime_select, :time_select,
:text_field, :password_field, :hidden_field,
:file_field, :text_area, :check_box,
:radio_button, :color_field,
:telephone_field, :phone_field, :date_field,
:time_field, :datetime_field, :datetime_local_field,
:month_field, :week_field, :url_field,
:email_field, :number_field, :range_field]
BUILDERS =
Hash.new do |h,k|
  h[k] = Class.new(k) do
    include FormBuilder
  end
end

Instance Method Summary collapse

Instance Method Details

#add_signed_fields(*fields) ⇒ Object

This method is used to add additional fields to sign. A usecase for this may be if you want to add fields later with javascript.

Examples:

<%= signed_form_for(@user) do |f| %>
  <% f.add_signed_fields :name, :address
<% end %>


80
81
82
83
# File 'lib/signed_form/form_builder.rb', line 80

def add_signed_fields(*fields)
  @signed_attributes_context.push(*fields)
  options[:digest] << @template if options[:digest]
end

#fields_for(record_name, record_object = nil, fields_options = {}, &block) ⇒ Object

Wrapper for Rails fields_for



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/signed_form/form_builder.rb', line 56

def fields_for(record_name, record_object = nil, fields_options = {}, &block)
  hash  = {}
  array = []

  if nested_attributes_association?(record_name)
    hash["#{record_name}_attributes"] = fields_options[:signed_attributes_context] = array
  else
    hash[record_name] = fields_options[:signed_attributes_context] = array
  end

  add_signed_fields hash

  content = super
  array.uniq!
  content
end

#form_signature_tagObject



42
43
44
45
46
47
48
49
50
51
# File 'lib/signed_form/form_builder.rb', line 42

def form_signature_tag
  @signed_attributes.each { |k,v| v.uniq! if v.is_a?(Array) }
  recursive_merge_identical_hashes! @signed_attributes
  encoded_data = Base64.strict_encode64 Marshal.dump(@signed_attributes)

  hmac = SignedForm::HMAC.new(secret_key: SignedForm.secret_key)
  signature = hmac.create(encoded_data)
  token = "#{encoded_data}--#{signature}"
  %(<input type="hidden" name="form_signature" value="#{token}" />\n).html_safe
end

#initializeObject



31
32
33
34
35
36
37
38
39
40
# File 'lib/signed_form/form_builder.rb', line 31

def initialize(*)
  super
  if options[:signed_attributes_context]
    @signed_attributes_context = options[:signed_attributes_context]
  else
    @signed_attributes = { object_name => [] }
    @signed_attributes_context = @signed_attributes[object_name]
    prepare_signed_attributes_hash
  end
end