mail_form 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,7 +1,12 @@
1
+ # Version 1.4
2
+
3
+ * Fixed bug that was causing all activerecord attributes be saved as nil
4
+ * Avoid symbol injection on forms
5
+
1
6
  # Version 1.3
2
7
 
3
- * Removed deprecated methods in version 1.2.
4
- * Added persisted? header and a generator.
8
+ * Removed deprecated methods in version 1.2
9
+ * Added persisted? header and a generator
5
10
 
6
11
  # Version 1.2
7
12
 
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Plataforma Tec http://blog.plataformatec.com.br/
1
+ Copyright (c) 2009-2012 Plataformatec http://plataformatec.com.br/
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md ADDED
@@ -0,0 +1,226 @@
1
+ ## MailForm
2
+ [![Build Status](https://secure.travis-ci.org/plataformatec/mail_form.png)](http://travis-ci.org/plataformatec/mail_form)
3
+
4
+ ### Rails 3
5
+
6
+ This gem was built on top of `ActiveModel` to showcase how you can pull in validations, naming
7
+ and `i18n` from Rails to your models without the need to implement it all by yourself.
8
+
9
+ In other words, this README refers to the **MailForm** gem to be used in Rails 3. For instructions
10
+ on how to use MailForm in Rails 2.x, please check the v1.0 branch:
11
+
12
+ http://github.com/plataformatec/mail_form/tree/v1.0
13
+
14
+ ### Description
15
+
16
+ **MailForm** allows you to send an e-mail straight from a form. For instance,
17
+ if you want to make a contact form just the following lines are needed (including the e-mail):
18
+
19
+ ```ruby
20
+ class ContactForm < MailForm::Base
21
+ attribute :name, :validate => true
22
+ attribute :email, :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
23
+ attribute :file, :attachment => true
24
+
25
+ attribute :message
26
+ attribute :nickname, :captcha => true
27
+
28
+ # Declare the e-mail headers. It accepts anything the mail method
29
+ # in ActionMailer accepts.
30
+ def headers
31
+ {
32
+ :subject => "My Contact Form",
33
+ :to => "your.email@your.domain.com",
34
+ :from => %("#{name}" <#{email}>)
35
+ }
36
+ end
37
+ end
38
+ ```
39
+
40
+ Then you start a console with `rails console` and type:
41
+
42
+ ```ruby
43
+ >> c = ContactForm.new(:name => 'José', :email => 'jose@email.com', :message => 'Cool!')
44
+ >> c.deliver
45
+ ```
46
+
47
+ Check your inbox and the e-mail will be there, with the sent fields (assuming that
48
+ you configured your mailer delivery method properly).
49
+
50
+ ### MailForm::Base
51
+
52
+ When you inherit from `MailForm::Base`, it pulls down a set of stuff from `ActiveModel`,
53
+ as `ActiveModel::Validation`, `ActiveModel::Translation` and `ActiveModel::Naming`.
54
+
55
+ This bring `I18n`, error messages, validations and attributes handling like in
56
+ `ActiveRecord` to **MailForm**, so **MailForm** can be used in your controllers and form builders without extra tweaks. This also means that instead of the following:
57
+
58
+ ```ruby
59
+ attribute :email, :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
60
+ ```
61
+
62
+ You could actually do this:
63
+
64
+ ```ruby
65
+ attribute :email
66
+ validates_format_of :email, :with => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
67
+ ```
68
+
69
+ Choose the one which pleases you the most. For more information on the API, please
70
+ continue reading below.
71
+
72
+ ### Playing together ORMs
73
+
74
+ **MailForm** plays nice with ORMs as well. You just need to include `MailForm::Delivery`
75
+ in your model and declare which attributes should be sent:
76
+
77
+ ```ruby
78
+ class User < ActiveRecord::Base
79
+ include MailForm::Delivery
80
+
81
+ append :remote_ip, :user_agent, :session
82
+ attributes :name, :email, :created_at
83
+
84
+ def headers
85
+ {
86
+ :to => "your.email@your.domain.com",
87
+ :subject => "User created an account"
88
+ }
89
+ end
90
+ end
91
+ ```
92
+
93
+ The delivery will be triggered in an `after_create` hook.
94
+
95
+ ## Installation
96
+
97
+ Install **MailForm** is very easy. Just edit your Gemfile adding the following:
98
+
99
+ ```ruby
100
+ gem 'mail_form'
101
+ ```
102
+ Then run `bundle install` to install **MailForm**.
103
+
104
+ If you want it as plugin, just do:
105
+
106
+ `script/plugin install git://github.com/plataformatec/mail_form.git`
107
+
108
+ ## API Overview
109
+
110
+ ### attributes(*attributes)
111
+
112
+ Declare your form attributes. All attributes declared here will be appended
113
+ to the e-mail, except the ones :captcha is true.
114
+
115
+ Options:
116
+
117
+ * :validate - A hook to validates_*_of. When true is given, validates the
118
+ presence of the attribute. When a regexp, validates format. When array,
119
+ validates the inclusion of the attribute in the array.
120
+
121
+ Whenever :validate is given, the presence is automatically checked. Give
122
+ :allow_blank => true to override.
123
+
124
+ Finally, when :validate is a symbol, the method given as symbol will be
125
+ called. Then you can add validations as you do in ActiveRecord (errors.add).
126
+
127
+ * :attachment - When given, expects a file to be sent and attaches
128
+ it to the e-mail. Don't forget to set your form to multitype.
129
+
130
+ * :captcha - When true, validates the attributes must be blank.
131
+ This is a simple way to avoid spam and the input should be hidden with CSS.
132
+
133
+ Examples:
134
+
135
+ ```ruby
136
+ class ContactForm < MailForm::Base
137
+ attributes :name, :validate => true
138
+ attributes :email, :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
139
+ attributes :type, :validate => ["General", "Interface bug"]
140
+ attributes :message
141
+ attributes :screenshot, :attachment => true, :validate => :interface_bug?
142
+ attributes :nickname, :captcha => true
143
+
144
+ def interface_bug?
145
+ if type == 'Interface bug' && screenshot.nil?
146
+ self.errors.add(:screenshot, "can't be blank on interface bugs")
147
+ end
148
+ end
149
+ end
150
+
151
+ c = ContactForm.new(:nickname => 'not_blank', :email => 'your@email.com', :name => 'José')
152
+ c.valid? #=> true
153
+ c.spam? #=> true (raises an error in development, to remember you to hide it)
154
+ c.deliver #=> false (just delivers if is not a spam and is valid, raises an error in development)
155
+
156
+ c = ContactForm.new(:email => 'invalid')
157
+ c.valid? #=> false
158
+ c.errors.inspect #=> { :name => :blank, :email => :invalid }
159
+ c.errors.full_messages #=> [ "Name can't be blank", "Email is invalid" ]
160
+
161
+ c = ContactForm.new(:name => 'José', :email => 'your@email.com')
162
+ c.deliver
163
+ ```
164
+
165
+ ### append(*methods)
166
+
167
+ **MailForm** also makes easy to append request information from client to the sent
168
+ mail. You just have to do:
169
+
170
+ ```ruby
171
+ class ContactForm < MailForm::Base
172
+ append :remote_ip, :user_agent, :session
173
+ # ...
174
+ end
175
+ ```
176
+
177
+ And in your controller:
178
+
179
+ ```ruby
180
+ @contact_form = ContactForm.new(params[:contact_form])
181
+ @contact_form.request = request
182
+ ```
183
+
184
+ The remote ip, user agent and session will be sent in the e-mail in a
185
+ request information session. You can give to append any method that the
186
+ request object responds to.
187
+
188
+ ## I18n
189
+
190
+ I18n in **MailForm** works like in ActiveRecord, so all models, attributes and messages
191
+ can be used with localized. Below is an I18n file example file:
192
+
193
+ ```ruby
194
+ mail_form:
195
+ models:
196
+ contact_form: "Your site contact form"
197
+ attributes:
198
+ contact_form:
199
+ email: "E-mail"
200
+ telephone: "Telephone number"
201
+ message: "Sent message"
202
+ request:
203
+ title: "Technical information about the user"
204
+ remote_ip: "IP Address"
205
+ user_agent: "Browser"
206
+ ```
207
+
208
+ ## Custom e-mail template
209
+
210
+ To customize the e-mail template that is used create a file called contact.erb in app/views/mail_form.
211
+ Take a look at lib/mail_form/views/mail_form/contact.erb in this repo to see how the default template works.
212
+
213
+ ## Maintainers
214
+
215
+ * José Valim - http://github.com/josevalim
216
+ * Carlos Antonio - http://github.com/carlosantoniodasilva
217
+
218
+ ## Contributors
219
+
220
+ * Andrew Timberlake - http://github.com/andrewtimberlake
221
+
222
+ ## Bugs and Feedback
223
+
224
+ If you discover any bug, please use github issues tracker.
225
+
226
+ Copyright (c) 2009-2012 Plataformatec http://plataformatec.com.br/
data/lib/mail_form.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  module MailForm
2
2
  autoload :Base, 'mail_form/base'
3
- autoload :Callbacks, 'mail_form/callbacks'
4
3
  autoload :Delivery, 'mail_form/delivery'
5
4
  autoload :Notifier, 'mail_form/notifier'
6
5
  autoload :Shim, 'mail_form/shim'
7
- end
6
+ end
@@ -36,10 +36,10 @@ module MailForm
36
36
  # * :validate - A hook to validates_*_of. When true is given, validates the
37
37
  # presence of the attribute. When a regexp, validates format. When array,
38
38
  # validates the inclusion of the attribute in the array.
39
- #
39
+ #
40
40
  # Whenever :validate is given, the presence is automatically checked. Give
41
41
  # :allow_blank => true to override.
42
- #
42
+ #
43
43
  # Finally, when :validate is a symbol, the method given as symbol will be
44
44
  # called. Then you can add validations as you do in ActiveRecord (errors.add).
45
45
  #
@@ -68,7 +68,10 @@ module MailForm
68
68
  #
69
69
  def attribute(*accessors)
70
70
  options = accessors.extract_options!
71
- attr_accessor *(accessors - instance_methods.map(&:to_sym))
71
+
72
+ # TODO: make this not depend on column_names
73
+ columns_methods = self.respond_to?(:column_names) ? column_names.map(&:to_sym) : []
74
+ attr_accessor(*(accessors - instance_methods.map(&:to_sym) - columns_methods))
72
75
 
73
76
  if options[:attachment]
74
77
  self.mail_attachments += accessors
@@ -147,5 +150,13 @@ module MailForm
147
150
  def deliver!
148
151
  MailForm::Notifier.contact(self).deliver
149
152
  end
153
+
154
+ # Returns a hash of attributes, according to the attributes existent in
155
+ # self.class.mail_attributes.
156
+ def mail_form_attributes
157
+ self.class.mail_attributes.each_with_object({}) do |attr, hash|
158
+ hash[attr.to_s] = send(attr)
159
+ end
160
+ end
150
161
  end
151
- end
162
+ end
@@ -25,19 +25,10 @@ module MailForm
25
25
  # Initialize assigning the parameters given as hash.
26
26
  def initialize(params={})
27
27
  params.each_pair do |attr, value|
28
- self.send(:"#{attr}=", value)
28
+ send("#{attr}=", value) if respond_to?("#{attr}=", true)
29
29
  end unless params.blank?
30
30
  end
31
31
 
32
- # Returns a hash of attributes, according to the attributes existent in
33
- # self.class.mail_attributes.
34
- def attributes
35
- self.class.mail_attributes.inject({}) do |hash, attr|
36
- hash[attr.to_s] = send(attr)
37
- hash
38
- end
39
- end
40
-
41
32
  # Always return true so when using form_for, the default method will be post.
42
33
  def new_record?
43
34
  true
@@ -62,4 +53,4 @@ module MailForm
62
53
  end
63
54
  alias :save :deliver
64
55
  end
65
- end
56
+ end
@@ -1,3 +1,3 @@
1
1
  module MailForm
2
- VERSION = "1.3.0".freeze
2
+ VERSION = "1.4.0".freeze
3
3
  end
@@ -1,6 +1,6 @@
1
1
  <h4 style="text-decoration:underline"><%= message.subject %></h4>
2
2
 
3
- <% @resource.attributes.each do |attribute, value|
3
+ <% @resource.mail_form_attributes.each do |attribute, value|
4
4
  next if value.blank? %>
5
5
 
6
6
  <p><b><%= @resource.class.human_attribute_name(attribute) %>:</b>
@@ -30,85 +30,85 @@ class MailFormNotifierTest < ActiveSupport::TestCase
30
30
 
31
31
  def test_body_contains_subject
32
32
  @form.deliver
33
- assert_match /Contact form/, first_delivery.body.to_s
33
+ assert_match %r[Contact form], first_delivery.body.to_s
34
34
  end
35
35
 
36
36
  def test_body_contains_attributes_values
37
37
  @form.deliver
38
- assert_match /José/, first_delivery.body.to_s
39
- assert_match /my.email@my.domain.com/, first_delivery.body.to_s
40
- assert_match /Cool/, first_delivery.body.to_s
38
+ assert_match %r[José], first_delivery.body.to_s
39
+ assert_match %r[my.email@my.domain.com], first_delivery.body.to_s
40
+ assert_match %r[Cool], first_delivery.body.to_s
41
41
  end
42
42
 
43
43
  def test_body_contains_attributes_names
44
44
  @form.deliver
45
- assert_match /Name:/, first_delivery.body.to_s
46
- assert_match /Email:/, first_delivery.body.to_s
47
- assert_match /Message:/, first_delivery.body.to_s
45
+ assert_match %r[Name:], first_delivery.body.to_s
46
+ assert_match %r[Email:], first_delivery.body.to_s
47
+ assert_match %r[Message:], first_delivery.body.to_s
48
48
  end
49
49
 
50
50
  def test_body_contains_localized_attributes_names
51
51
  I18n.backend.store_translations(:en, :mail_form => { :attributes => { :contact_form => { :message => 'Sent message' } } })
52
52
  @form.deliver
53
- assert_match /Sent message:/, first_delivery.body.to_s
54
- assert_no_match /Message:/, first_delivery.body.to_s
53
+ assert_match %r[Sent message:], first_delivery.body.to_s
54
+ assert_no_match %r[Message:], first_delivery.body.to_s
55
55
  end
56
56
 
57
57
  def test_body_mail_format_messages_with_break_line
58
58
  @form.deliver
59
- assert_no_match /<p>Cool/, first_delivery.body.to_s
59
+ assert_no_match %r[<p>Cool], first_delivery.body.to_s
60
60
 
61
61
  @advanced.deliver
62
- assert_match /<p>Cool/, last_delivery.body.to_s
62
+ assert_match %r[<p>Cool], last_delivery.body.to_s
63
63
  end
64
64
 
65
65
  def test_body_mail_format_dates_with_i18n
66
66
  @form.deliver
67
- assert_no_match /I18n.l(Date.today)/, first_delivery.body.to_s
67
+ assert_no_match %r[I18n.l(Date.today)], first_delivery.body.to_s
68
68
  end
69
69
 
70
70
  def test_body_does_not_append_request_if_append_is_not_called
71
71
  @form.deliver
72
- assert_no_match /Request information/, first_delivery.body.to_s
72
+ assert_no_match %r[Request information], first_delivery.body.to_s
73
73
  end
74
74
 
75
75
  def test_body_does_append_request_if_append_is_called
76
76
  @advanced.deliver
77
- assert_match /Request information/, last_delivery.body.to_s
77
+ assert_match %r[Request information], last_delivery.body.to_s
78
78
  end
79
79
 
80
80
  def test_request_title_is_localized
81
81
  I18n.backend.store_translations(:en, :mail_form => { :request => { :title => 'Information about the request' } })
82
82
  @advanced.deliver
83
- assert_no_match /Request information/, last_delivery.body.to_s
84
- assert_match /Information about the request/, last_delivery.body.to_s
83
+ assert_no_match %r[Request information], last_delivery.body.to_s
84
+ assert_match %r[Information about the request], last_delivery.body.to_s
85
85
  end
86
86
 
87
87
  def test_request_info_attributes_are_printed
88
88
  @advanced.deliver
89
- assert_match /Remote ip/, last_delivery.body.to_s
90
- assert_match /User agent/, last_delivery.body.to_s
89
+ assert_match %r[Remote ip], last_delivery.body.to_s
90
+ assert_match %r[User agent], last_delivery.body.to_s
91
91
  end
92
92
 
93
93
  def test_request_info_attributes_are_localized
94
94
  I18n.backend.store_translations(:en, :mail_form => { :request => { :remote_ip => 'IP Address' } })
95
95
  @advanced.deliver
96
- assert_match /IP Address/, last_delivery.body.to_s
97
- assert_no_match /Remote ip/, last_delivery.body.to_s
96
+ assert_match %r[IP Address], last_delivery.body.to_s
97
+ assert_no_match %r[Remote ip], last_delivery.body.to_s
98
98
  end
99
99
 
100
100
  def test_request_info_values_are_printed
101
101
  @advanced.deliver
102
- assert_match /0\.0\.0\.0/, last_delivery.body.to_s
103
- assert_match /Rails Testing/, last_delivery.body.to_s
102
+ assert_match %r[0\.0\.0\.0], last_delivery.body.to_s
103
+ assert_match %r[Rails Testing], last_delivery.body.to_s
104
104
  end
105
105
 
106
106
  def test_request_info_hashes_are_print_inside_lis
107
107
  @request.session = { :my => :session, :user => "data" }
108
108
  @advanced.deliver
109
- assert_match /<ul/, last_delivery.body.to_s
110
- assert_match /<li>my: :session<\/li>/, last_delivery.body.to_s
111
- assert_match /<li>user: &quot;data&quot;<\/li>/, last_delivery.body.to_s
109
+ assert_match %r[<ul], last_delivery.body.to_s
110
+ assert_match %r[<li>my: :session<\/li>], last_delivery.body.to_s
111
+ assert_match %r[<li>user: &quot;data&quot;<\/li>], last_delivery.body.to_s
112
112
  end
113
113
 
114
114
  def test_error_is_raised_when_append_is_given_but_no_request_is_given
@@ -125,7 +125,7 @@ class MailFormNotifierTest < ActiveSupport::TestCase
125
125
 
126
126
  def test_form_with_file_does_not_output_attachment_as_attribute
127
127
  @with_file.deliver
128
- assert_no_match /File:/, first_delivery.body.to_s
128
+ assert_no_match %r[File:], first_delivery.body.to_s
129
129
  end
130
130
 
131
131
  protected
@@ -137,8 +137,8 @@ class MailFormNotifierTest < ActiveSupport::TestCase
137
137
  def last_delivery
138
138
  ActionMailer::Base.deliveries.last
139
139
  end
140
-
140
+
141
141
  def teardown
142
142
  I18n.reload!
143
143
  end
144
- end
144
+ end
@@ -61,9 +61,9 @@ class MailFormBaseTest < ActiveSupport::TestCase
61
61
 
62
62
  def test_symbols_given_to_validate_are_called
63
63
  form = ContactForm.new
64
- assert form.instance_variable_get('@_callback_run').nil?
64
+ assert !form.callback_run?
65
65
  form.valid?
66
- assert form.instance_variable_get('@_callback_run')
66
+ assert form.callback_run?
67
67
  end
68
68
 
69
69
  def test_deliver_is_false_when_is_a_spam
@@ -0,0 +1 @@
1
+ A test file
data/test/test_helper.rb CHANGED
@@ -26,19 +26,22 @@ class ContactForm < MailForm::Base
26
26
 
27
27
  attributes :created_at, :message, :validate => :callback
28
28
 
29
- before_deliver :set_created_at
30
-
31
29
  def headers
32
30
  { :to => 'my.email@my.domain.com' }
33
31
  end
34
32
 
35
- def set_created_at
36
- created_at = Date.today
33
+ def initialize(*)
34
+ super
35
+ @_callback_run = false
37
36
  end
38
37
 
39
38
  def callback
40
39
  @_callback_run = true
41
40
  end
41
+
42
+ def callback_run?
43
+ @_callback_run
44
+ end
42
45
  end
43
46
 
44
47
  class AdvancedForm < ContactForm
@@ -0,0 +1 @@
1
+ Hello from my custom template!
metadata CHANGED
@@ -1,77 +1,85 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mail_form
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 3
8
- - 0
9
- version: 1.3.0
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.4.0
10
6
  platform: ruby
11
- authors:
12
- - "Jos\xC3\xA9 Valim"
13
- - "Carlos Ant\xC3\xB4nio"
7
+ authors:
8
+ - José Valim
9
+ - Carlos Antônio
14
10
  autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
-
18
- date: 2010-05-26 00:00:00 +02:00
19
- default_executable:
20
- dependencies: []
21
-
22
- description: Send e-mail straight from forms in Rails with I18n, validations, attachments and request information.
13
+ date: 2012-12-13 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '3.0'
21
+ none: false
22
+ name: actionmailer
23
+ type: :runtime
24
+ prerelease: false
25
+ requirement: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ none: false
31
+ description: ! '{Send e-mail straight from forms in Rails with I18n, validations,
32
+ attachments and request information.'
23
33
  email: contact@plataformatec.com.br
24
34
  executables: []
25
-
26
35
  extensions: []
27
-
28
- extra_rdoc_files:
29
- - README.rdoc
30
- files:
36
+ extra_rdoc_files: []
37
+ files:
31
38
  - CHANGELOG
32
39
  - MIT-LICENSE
33
- - README.rdoc
34
- - Rakefile
40
+ - README.md
35
41
  - lib/generators/rails/mail_form_generator.rb
36
42
  - lib/generators/rails/templates/model.rb
37
- - lib/mail_form.rb
38
43
  - lib/mail_form/base.rb
39
44
  - lib/mail_form/delivery.rb
40
45
  - lib/mail_form/notifier.rb
41
46
  - lib/mail_form/shim.rb
42
47
  - lib/mail_form/version.rb
43
48
  - lib/mail_form/views/mail_form/contact.erb
44
- has_rdoc: true
45
- homepage: http://github.com/plataformatec/mail_form
49
+ - lib/mail_form.rb
50
+ - test/mail_form_test.rb
51
+ - test/resource_test.rb
52
+ - test/test_file.txt
53
+ - test/test_helper.rb
54
+ - test/views/mail_form/custom_template.erb
55
+ homepage: https://github.com/plataformatec/mail_form
46
56
  licenses: []
47
-
48
57
  post_install_message:
49
- rdoc_options:
50
- - --charset=UTF-8
51
- require_paths:
58
+ rdoc_options: []
59
+ require_paths:
52
60
  - lib
53
- required_ruby_version: !ruby/object:Gem::Requirement
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 0
59
- version: "0"
60
- required_rubygems_version: !ruby/object:Gem::Requirement
61
- requirements:
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- segments:
65
- - 0
66
- version: "0"
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ none: false
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ none: false
67
73
  requirements: []
68
-
69
- rubyforge_project:
70
- rubygems_version: 1.3.6
74
+ rubyforge_project: mail_form
75
+ rubygems_version: 1.8.23
71
76
  signing_key:
72
77
  specification_version: 3
73
- summary: Send e-mail straight from forms in Rails with I18n, validations, attachments and request information.
74
- test_files:
78
+ summary: Send e-mail straight from forms in Rails with I18n, validations, attachments
79
+ and request information.
80
+ test_files:
75
81
  - test/mail_form_test.rb
76
82
  - test/resource_test.rb
83
+ - test/test_file.txt
77
84
  - test/test_helper.rb
85
+ - test/views/mail_form/custom_template.erb
data/README.rdoc DELETED
@@ -1,199 +0,0 @@
1
- == MailForm
2
-
3
- === Rails 3
4
-
5
- This gem was built on top of ActiveModel to showcase how you can pull in validations, naming
6
- and i18n from Rails to your models without the need to implement it all by yourself.
7
-
8
- In other words, this README refers to the MailForm gem to be used in Rails 3. For instructions
9
- on how to use MailForm in Rails 2.x, please check the v1.0 branch:
10
-
11
- http://github.com/plataformatec/mail_form/tree/v1.0
12
-
13
- === Description
14
-
15
- MailForm allows you to send an e-mail straight from a form. For instance,
16
- if you want to make a contact form just the following lines are needed (including the e-mail):
17
-
18
- class ContactForm < MailForm::Base
19
- attribute :name, :validate => true
20
- attribute :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
21
- attribute :file, :attachment => true
22
-
23
- attribute :message
24
- attribute :nickname, :captcha => true
25
-
26
- # Declare the e-mail headers. It accepts anything the mail method
27
- # in ActionMailer accepts.
28
- def headers
29
- {
30
- :subject => "My Contact Form",
31
- :to => "your.email@your.domain.com",
32
- :from => %("#{name}" <#{email}>)
33
- }
34
- end
35
- end
36
-
37
- Then you start a script/console and type:
38
-
39
- c = ContactForm.new(:name => 'José', :email => 'jose@email.com', :message => 'Cool!')
40
- c.create
41
-
42
- Check your inbox and the e-mail will be there, with the sent fields (assuming that
43
- you configured your mailer delivery method properly).
44
-
45
- === MailForm::Base
46
-
47
- When you inherit from MailForm::Base, it pulls down a set of stuff from ActiveModel,
48
- as ActiveModel::Validation, ActiveModel::Translation and ActiveModel::Naming.
49
-
50
- This bring I18n, error messages, validations and attributes handling like in
51
- ActiveRecord to MailForm, so MailForm can be used in your controllers and form builders without extra tweaks. This also means that instead of the following:
52
-
53
- attribute :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
54
-
55
- You could actually do this:
56
-
57
- attribute :email
58
- validates_format_of :email, :with => /[^@]+@[^\.]+\.[\w\.\-]+/
59
-
60
- Choose the one which pleases you the most. For more information on the API, please
61
- continue reading below.
62
-
63
- === Playing together ORMs
64
-
65
- MailForm plays nice with ORMs as well. You just need to include MailForm::Delivery
66
- in your model and declare which attributes should be sent:
67
-
68
- class User < ActiveRecord::Base
69
- include MailForm::Delivery
70
-
71
- append :remote_ip, :user_agent, :session
72
- attributes :name, :email, :created_at
73
-
74
- def headers
75
- {
76
- :to => "your.email@your.domain.com",
77
- :subject => "User created an account"
78
- }
79
- end
80
- end
81
-
82
- The delivery will be triggered in an after_create hook.
83
-
84
- == Installation
85
-
86
- Install MailForm is very easy. It is stored in Gemcutter, so just run the following:
87
-
88
- sudo gem install mail_form
89
-
90
- If you want it as plugin, just do:
91
-
92
- script/plugin install git://github.com/plataformatec/mail_form.git
93
-
94
- == API Overview
95
-
96
- === attributes(*attributes)
97
-
98
- Declare your form attributes. All attributes declared here will be appended
99
- to the e-mail, except the ones :captcha is true.
100
-
101
- Options:
102
-
103
- * :validate - A hook to validates_*_of. When true is given, validates the
104
- presence of the attribute. When a regexp, validates format. When array,
105
- validates the inclusion of the attribute in the array.
106
-
107
- Whenever :validate is given, the presence is automatically checked. Give
108
- :allow_blank => true to override.
109
-
110
- Finally, when :validate is a symbol, the method given as symbol will be
111
- called. Then you can add validations as you do in ActiveRecord (errors.add).
112
-
113
- * :attachment - When given, expects a file to be sent and attaches
114
- it to the e-mail. Don't forget to set your form to multitype.
115
-
116
- * :captcha - When true, validates the attributes must be blank.
117
- This is a simple way to avoid spam and the input should be hidden with CSS.
118
-
119
- Examples:
120
-
121
- class ContactForm < MailForm::Base
122
- attributes :name, :validate => true
123
- attributes :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
124
- attributes :type, :validate => ["General", "Interface bug"]
125
- attributes :message
126
- attributes :screenshot, :attachment => true, :validate => :interface_bug?
127
- attributes :nickname, :captcha => true
128
-
129
- def interface_bug?
130
- if type == 'Interface bug' && screenshot.nil?
131
- self.errors.add(:screenshot, "can't be blank on interface bugs")
132
- end
133
- end
134
- end
135
-
136
- c = ContactForm.new(:nickname => 'not_blank', :email => 'your@email.com', :name => 'José')
137
- c.valid? #=> true
138
- c.spam? #=> true (raises an error in development, to remember you to hide it)
139
- c.deliver #=> false (just delivers if is not a spam and is valid)
140
-
141
- c = ContactForm.new(:email => 'invalid')
142
- c.valid? #=> false
143
- c.errors.inspect #=> { :name => :blank, :email => :invalid }
144
- c.errors.full_messages #=> [ "Name can't be blank", "Email is invalid" ]
145
-
146
- c = ContactForm.new(:name => 'José', :email => 'your@email.com')
147
- c.deliver #=> true
148
-
149
- === append(*methods)
150
-
151
- MailForm also makes easy to append request information from client to the sent
152
- mail. You just have to do:
153
-
154
- class ContactForm < MailForm::Base
155
- append :remote_ip, :user_agent, :session
156
- # ...
157
- end
158
-
159
- And in your controller:
160
-
161
- @contact_form = ContactForm.new(params[:contact_form])
162
- @contact_form.request = request
163
-
164
- The remote ip, user agent and session will be sent in the e-mail in a
165
- request information session. You can give to append any method that the
166
- request object responds to.
167
-
168
- == I18n
169
-
170
- I18n in MailForm works like in ActiveRecord, so all models, attributes and messages
171
- can be used with localized. Below is an I18n file example file:
172
-
173
- mail_form:
174
- models:
175
- contact_form: "Your site contact form"
176
- attributes:
177
- contact_form:
178
- email: "E-mail"
179
- telephone: "Telephone number"
180
- message: "Sent message"
181
- request:
182
- title: "Technical information about the user"
183
- remote_ip: "IP Address"
184
- user_agent: "Browser"
185
-
186
- == Maintainers
187
-
188
- * José Valim - http://github.com/josevalim
189
- * Carlos Antonio - http://github.com/carlosantoniodasilva
190
-
191
- == Contributors
192
-
193
- * Andrew Timberlake - http://github.com/andrewtimberlake
194
-
195
- == Bugs and Feedback
196
-
197
- If you discover any bug, please use github issues tracker.
198
-
199
- Copyright (c) 2010 Plataforma Tec http://blog.plataformatec.com.br/
data/Rakefile DELETED
@@ -1,41 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'rake'
4
- require 'rake/testtask'
5
- require 'rake/rdoctask'
6
- require File.join(File.dirname(__FILE__), "lib", "mail_form", "version")
7
-
8
- desc 'Run tests for MailForm.'
9
- Rake::TestTask.new(:test) do |t|
10
- t.libs << 'test'
11
- t.pattern = 'test/**/*_test.rb'
12
- t.verbose = true
13
- end
14
-
15
- desc 'Generate documentation for MailForm.'
16
- Rake::RDocTask.new(:rdoc) do |rdoc|
17
- rdoc.rdoc_dir = 'rdoc'
18
- rdoc.title = 'MailForm'
19
- rdoc.options << '--line-numbers' << '--inline-source'
20
- rdoc.rdoc_files.include('README')
21
- rdoc.rdoc_files.include('MIT-LICENSE')
22
- rdoc.rdoc_files.include('lib/**/*.rb')
23
- end
24
-
25
- begin
26
- require 'jeweler'
27
- Jeweler::Tasks.new do |s|
28
- s.name = "mail_form"
29
- s.version = MailForm::VERSION
30
- s.summary = "Send e-mail straight from forms in Rails with I18n, validations, attachments and request information."
31
- s.email = "contact@plataformatec.com.br"
32
- s.homepage = "http://github.com/plataformatec/mail_form"
33
- s.description = "Send e-mail straight from forms in Rails with I18n, validations, attachments and request information."
34
- s.authors = ['José Valim', 'Carlos Antônio']
35
- s.files = FileList["[A-Z]*", "{lib,views}/**/*"]
36
- end
37
-
38
- Jeweler::GemcutterTasks.new
39
- rescue LoadError
40
- puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
41
- end