simple_form 0.4.0 → 0.5
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.
Potentially problematic release.
This version of simple_form might be problematic. Click here for more details.
- data/CHANGELOG +10 -0
- data/README.rdoc +6 -181
- data/Rakefile +2 -23
- data/lib/simple_form.rb +1 -33
- metadata +4 -14
- data/MIT-LICENSE +0 -20
- data/lib/simple_form/base.rb +0 -126
- data/lib/simple_form/dsl.rb +0 -171
- data/lib/simple_form/errors.rb +0 -59
- data/lib/simple_form/notifier.rb +0 -48
- data/lib/simple_form/version.rb +0 -3
- data/test/base_test.rb +0 -110
- data/test/errors_test.rb +0 -85
- data/test/notifier_test.rb +0 -183
- data/test/test_helper.rb +0 -64
- data/views/simple_form/notifier/contact.erb +0 -30
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
* Version 0.5
|
2
|
+
|
3
|
+
* SimpleForm is deprecated in favor of MailForm:
|
4
|
+
|
5
|
+
http://github.com/plataformatec/mail_form/tree/v1.0
|
6
|
+
|
7
|
+
For a Rails 2.3 version, please install:
|
8
|
+
|
9
|
+
gem install mail_form --version=1.0
|
10
|
+
|
1
11
|
* Version 0.4
|
2
12
|
|
3
13
|
* Added support to template
|
data/README.rdoc
CHANGED
@@ -1,184 +1,9 @@
|
|
1
|
-
==
|
1
|
+
== Deprecation
|
2
2
|
|
3
|
-
|
4
|
-
to have a contact form (including the e-mail):
|
3
|
+
SimpleForm is deprecated in favor of MailForm:
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
sender{|c| %{"#{c.name}" <#{c.email}>} }
|
5
|
+
http://github.com/plataformatec/mail_form/tree/v1.0
|
6
|
+
|
7
|
+
For a Rails 2.3 version, please install:
|
10
8
|
|
11
|
-
|
12
|
-
attribute :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
|
13
|
-
attribute :file, :attachment => true
|
14
|
-
|
15
|
-
attribute :message
|
16
|
-
attribute :nickname, :captcha => true
|
17
|
-
end
|
18
|
-
|
19
|
-
Then you start a script/console and type:
|
20
|
-
|
21
|
-
c = ContactForm.new(:name => 'José', :email => 'jose@email.com', :message => 'Cool!')
|
22
|
-
c.deliver
|
23
|
-
|
24
|
-
Check your inbox and the e-mail will be there, with the sent fields (assuming
|
25
|
-
that you configured your smtp properly).
|
26
|
-
|
27
|
-
SimpleForm also support attachments, I18n, error messages like in ActiveRecord
|
28
|
-
(so it works with custom FormBuilders) and can also send the user request information
|
29
|
-
in the contact mail.
|
30
|
-
|
31
|
-
It's tested and compatible with Rails 2.2.x and Rails 2.3.x.
|
32
|
-
|
33
|
-
== Installation
|
34
|
-
|
35
|
-
Install Simple Form is very easy. It is stored in Gemcutter, so just run the following:
|
36
|
-
|
37
|
-
gem sources -a http://gemcutter.org
|
38
|
-
sudo gem install simple_form
|
39
|
-
|
40
|
-
If you want it as plugin, just do:
|
41
|
-
|
42
|
-
script/plugin install git://github.com/josevalim/simple_form.git
|
43
|
-
|
44
|
-
== Request
|
45
|
-
|
46
|
-
SimpleForm makes easy to append user information to the contact mail. You just
|
47
|
-
have to do:
|
48
|
-
|
49
|
-
class ContactForm < SimpleForm
|
50
|
-
append :remote_ip, :user_agent, :session
|
51
|
-
# ...
|
52
|
-
end
|
53
|
-
|
54
|
-
And in your controller:
|
55
|
-
|
56
|
-
@contact_form = ContactForm.new(params[:contact_form], request)
|
57
|
-
|
58
|
-
And the remote ip, user agent and session will be sent in the e-mail in a
|
59
|
-
request information session. You can give to append any method that the
|
60
|
-
request object responds to.
|
61
|
-
|
62
|
-
== API Overview
|
63
|
-
|
64
|
-
==== attributes(*attributes)
|
65
|
-
|
66
|
-
Declare your form attributes. All attributes declared here will be appended
|
67
|
-
to the e-mail, except the ones :captcha is true.
|
68
|
-
|
69
|
-
Options:
|
70
|
-
|
71
|
-
* :validate - When true, validates the attributes can't be blank.
|
72
|
-
When a regexp is given, check if the attribute matches is not blank and
|
73
|
-
then if it matches the regexp.
|
74
|
-
|
75
|
-
Whenever :validate is a symbol, the method given as symbol will be
|
76
|
-
called. You can then add validations as you do in ActiveRecord (errors.add).
|
77
|
-
|
78
|
-
* :attachment - When given, expects a file to be sent and attaches
|
79
|
-
it to the e-mail. Don't forget to set your form to multitype.
|
80
|
-
|
81
|
-
* :captcha - When true, validates the attributes must be blank.
|
82
|
-
This is a simple way to avoid spam and the input should be hidden with CSS.
|
83
|
-
|
84
|
-
Examples:
|
85
|
-
|
86
|
-
class ContactForm < SimpleForm
|
87
|
-
attributes :name, :validate => true
|
88
|
-
attributes :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
|
89
|
-
attributes :message
|
90
|
-
attributes :screenshot, :attachment => true, :validate => :screenshot_required?
|
91
|
-
attributes :nickname, :captcha => true
|
92
|
-
|
93
|
-
def screenshot_required?
|
94
|
-
# ...
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
c = ContactForm.new(:nickname => 'not_blank', :email => 'your@email.com', :name => 'José')
|
99
|
-
c.valid? #=> true
|
100
|
-
c.spam? #=> true (raises an error in development, to remember you to hide it)
|
101
|
-
c.deliver #=> false (just delivers if is not a spam and is valid)
|
102
|
-
|
103
|
-
c = ContactForm.new(:email => 'invalid')
|
104
|
-
c.valid? #=> false
|
105
|
-
c.errors.inspect #=> { :name => :blank, :email => :invalid }
|
106
|
-
c.errors.full_messages #=> [ "Name can't be blank", "Email is invalid" ]
|
107
|
-
|
108
|
-
c = ContactForm.new(:name => 'José', :email => 'your@email.com')
|
109
|
-
# save is an alias to deliver to allow it to work with InheritedResources
|
110
|
-
c.save #=> true
|
111
|
-
|
112
|
-
==== subject(string_or_symbol_or_block)
|
113
|
-
|
114
|
-
Declares the subject of the contact email. It can be a string or a proc or a symbol.
|
115
|
-
|
116
|
-
When a symbol is given, it will call a method on the form object with the same
|
117
|
-
name as the symbol. As a proc, it receives a simple form instance. It defaults
|
118
|
-
to the class human name.
|
119
|
-
|
120
|
-
subject "My Contact Form"
|
121
|
-
subject { |c| "Contacted by #{c.name}" }
|
122
|
-
|
123
|
-
==== sender(string_or_symbol_or_block)
|
124
|
-
|
125
|
-
Declares contact email sender. It can be a string or a proc or a symbol.
|
126
|
-
|
127
|
-
When a symbol is given, it will call a method on the form object with the same
|
128
|
-
name as the symbol. As a proc, it receives a simple form instance. By default is:
|
129
|
-
|
130
|
-
sender{ |c| c.email }
|
131
|
-
|
132
|
-
This requires that your SimpleForm object have an email attribute.
|
133
|
-
|
134
|
-
==== recipients(string_or_array_or_symbol_or_block)
|
135
|
-
|
136
|
-
Who will receive the e-mail. Can be a string or array or a symbol or a proc.
|
137
|
-
|
138
|
-
When a symbol is given, it will call a method on the form object with the same
|
139
|
-
name as the symbol. As a proc, it receives a simple form instance.
|
140
|
-
|
141
|
-
Both the proc and the symbol must return a string or an array. By default is nil.
|
142
|
-
|
143
|
-
==== template(string_or_symbol_or_proc)
|
144
|
-
|
145
|
-
Allow you to set the template that is going to rendered. This allows you to have
|
146
|
-
several simple_form instances, using different templates.
|
147
|
-
|
148
|
-
==== headers(hash)
|
149
|
-
|
150
|
-
Additional headers to your e-mail.
|
151
|
-
|
152
|
-
== I18n
|
153
|
-
|
154
|
-
All models, attributes and messages in SimpleForm can be used with localized.
|
155
|
-
Below is an I18n example file:
|
156
|
-
|
157
|
-
simple_form:
|
158
|
-
models:
|
159
|
-
contact_form: "Your site contact form"
|
160
|
-
attributes:
|
161
|
-
email: "E-mail"
|
162
|
-
telephone: "Telephone number"
|
163
|
-
message: "Sent message"
|
164
|
-
messages:
|
165
|
-
blank: "can not be blank"
|
166
|
-
invalid: "is not valid"
|
167
|
-
telephone: "must have eight digits"
|
168
|
-
request:
|
169
|
-
title: "Technical information about the user"
|
170
|
-
remote_ip: "IP Address"
|
171
|
-
user_agent: "Browser"
|
172
|
-
|
173
|
-
== Contributors
|
174
|
-
|
175
|
-
* José Valim - http://github.com/josevalim
|
176
|
-
* Carlos Antonio - http://github.com/carlosantoniodasilva
|
177
|
-
* Andrew Timberlake - http://github.com/andrewtimberlake
|
178
|
-
|
179
|
-
== Bugs and Feedback
|
180
|
-
|
181
|
-
If you discover any bugs, please send an e-mail to contact@plataformatec.com.be
|
182
|
-
If you just want to give some positive feedback or drop a line, that's fine too!
|
183
|
-
|
184
|
-
Copyright (c) 2009 Plataforma Tec http://blog.plataformatec.com.br/
|
9
|
+
gem install mail_form --version=1.0
|
data/Rakefile
CHANGED
@@ -1,35 +1,14 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
require File.join(File.dirname(__FILE__), "lib", "simple_form", "version")
|
5
|
-
|
6
|
-
desc 'Run tests for SimpleForm.'
|
7
|
-
Rake::TestTask.new(:test) do |t|
|
8
|
-
t.pattern = 'test/**/*_test.rb'
|
9
|
-
t.verbose = true
|
10
|
-
end
|
11
|
-
|
12
|
-
desc 'Generate documentation for SimpleForm.'
|
13
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
14
|
-
rdoc.rdoc_dir = 'rdoc'
|
15
|
-
rdoc.title = 'SimpleForm'
|
16
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
17
|
-
rdoc.rdoc_files.include('README')
|
18
|
-
rdoc.rdoc_files.include('MIT-LICENSE')
|
19
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
20
|
-
end
|
21
|
-
|
22
1
|
begin
|
23
2
|
require 'jeweler'
|
24
3
|
Jeweler::Tasks.new do |s|
|
25
4
|
s.name = "simple_form"
|
26
|
-
s.version =
|
5
|
+
s.version = "0.5"
|
27
6
|
s.summary = "Simple easy contact form for Rails with I18n, validations, attachments and request information."
|
28
7
|
s.email = "contact@plataformatec.com.br"
|
29
8
|
s.homepage = "http://github.com/josevalim/simple_form"
|
30
9
|
s.description = "Simple easy contact form for Rails with I18n, validations, attachments and request information."
|
31
10
|
s.authors = ['José Valim', 'Carlos Antônio']
|
32
|
-
s.files = FileList["[A-Z]*", "{lib,views}/**/*"]
|
11
|
+
s.files = FileList["[A-Z]*", "init.rb", "install.rb", "{lib,views}/**/*"]
|
33
12
|
end
|
34
13
|
|
35
14
|
Jeweler::GemcutterTasks.new
|
data/lib/simple_form.rb
CHANGED
@@ -1,33 +1 @@
|
|
1
|
-
|
2
|
-
require File.join(dir, 'simple_form', 'base')
|
3
|
-
require File.join(dir, 'simple_form', 'dsl')
|
4
|
-
require File.join(dir, 'simple_form', 'errors')
|
5
|
-
require File.join(dir, 'simple_form', 'notifier')
|
6
|
-
|
7
|
-
class SimpleForm
|
8
|
-
extend SimpleForm::DSL
|
9
|
-
|
10
|
-
ACCESSORS = [ :form_attributes, :form_validatable, :form_subject,
|
11
|
-
:form_attachments, :form_recipients, :form_sender,
|
12
|
-
:form_captcha, :form_headers, :form_template, :form_appendable ]
|
13
|
-
|
14
|
-
DEFAULT_MESSAGES = { :blank => "can't be blank", :invalid => "is invalid" }
|
15
|
-
|
16
|
-
class_inheritable_reader *ACCESSORS
|
17
|
-
protected *ACCESSORS
|
18
|
-
|
19
|
-
# Initialize arrays and hashes
|
20
|
-
#
|
21
|
-
write_inheritable_array :form_captcha, []
|
22
|
-
write_inheritable_array :form_appendable, []
|
23
|
-
write_inheritable_array :form_attributes, []
|
24
|
-
write_inheritable_array :form_attachments, []
|
25
|
-
write_inheritable_hash :form_validatable, {}
|
26
|
-
|
27
|
-
headers({})
|
28
|
-
sender {|c| c.email }
|
29
|
-
subject{|c| c.class.human_name }
|
30
|
-
template 'contact'
|
31
|
-
end
|
32
|
-
|
33
|
-
SimpleForm::Notifier.template_root = File.join(dir, '..', 'views')
|
1
|
+
raise RuntimeError, "\n\n" + File.read(File.expand_path("../README.rdoc", File.dirname(__FILE__)))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.5"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jos\xC3\xA9 Valim"
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-12-24 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -24,16 +24,9 @@ extra_rdoc_files:
|
|
24
24
|
- README.rdoc
|
25
25
|
files:
|
26
26
|
- CHANGELOG
|
27
|
-
- MIT-LICENSE
|
28
27
|
- README.rdoc
|
29
28
|
- Rakefile
|
30
29
|
- lib/simple_form.rb
|
31
|
-
- lib/simple_form/base.rb
|
32
|
-
- lib/simple_form/dsl.rb
|
33
|
-
- lib/simple_form/errors.rb
|
34
|
-
- lib/simple_form/notifier.rb
|
35
|
-
- lib/simple_form/version.rb
|
36
|
-
- views/simple_form/notifier/contact.erb
|
37
30
|
has_rdoc: true
|
38
31
|
homepage: http://github.com/josevalim/simple_form
|
39
32
|
licenses: []
|
@@ -62,8 +55,5 @@ rubygems_version: 1.3.5
|
|
62
55
|
signing_key:
|
63
56
|
specification_version: 3
|
64
57
|
summary: Simple easy contact form for Rails with I18n, validations, attachments and request information.
|
65
|
-
test_files:
|
66
|
-
|
67
|
-
- test/errors_test.rb
|
68
|
-
- test/notifier_test.rb
|
69
|
-
- test/test_helper.rb
|
58
|
+
test_files: []
|
59
|
+
|
data/MIT-LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) 2009 Plataforma Tec http://blog.plataformatec.com.br/
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/simple_form/base.rb
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
class SimpleForm
|
2
|
-
attr_accessor :request
|
3
|
-
|
4
|
-
# Initialize assigning the parameters given as hash (just as in ActiveRecord).
|
5
|
-
#
|
6
|
-
# It also accepts the request object as second parameter which must be sent
|
7
|
-
# whenever :append is called.
|
8
|
-
#
|
9
|
-
def initialize(params={}, request=nil)
|
10
|
-
@request = request
|
11
|
-
params.each_pair do |attr, value|
|
12
|
-
self.send(:"#{attr}=", value)
|
13
|
-
end unless params.blank?
|
14
|
-
end
|
15
|
-
|
16
|
-
# In development, raises an error if the captcha field is not blank. This is
|
17
|
-
# is good to remember that the field should be hidden with CSS and shown only
|
18
|
-
# to robots.
|
19
|
-
#
|
20
|
-
# In test and in production, it returns true if aall captcha field are blank,
|
21
|
-
# returns false otherwise.
|
22
|
-
#
|
23
|
-
def spam?
|
24
|
-
form_captcha.each do |field|
|
25
|
-
next if send(field).blank?
|
26
|
-
|
27
|
-
if RAILS_ENV == 'development'
|
28
|
-
raise ScriptError, "The captcha field #{field} was supposed to be blank"
|
29
|
-
else
|
30
|
-
return true
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
return false
|
35
|
-
end
|
36
|
-
|
37
|
-
def not_spam?
|
38
|
-
!spam?
|
39
|
-
end
|
40
|
-
|
41
|
-
# To check if the form is valid, we run the validations.
|
42
|
-
#
|
43
|
-
# If the validation is true, we just check if the field is not blank. If it's
|
44
|
-
# a regexp, we check if it is not blank AND if the Regexp matches.
|
45
|
-
#
|
46
|
-
# You can have totally custom validations by sending a symbol. Then the method
|
47
|
-
# given as symbol will be called and then you cann hook your validations there.
|
48
|
-
#
|
49
|
-
def valid?
|
50
|
-
return false unless errors.empty?
|
51
|
-
|
52
|
-
form_validatable.each_pair do |field, validation|
|
53
|
-
next unless validation
|
54
|
-
|
55
|
-
if validation.is_a?(Symbol)
|
56
|
-
send(validation)
|
57
|
-
elsif send(field).blank?
|
58
|
-
errors.add(field, :blank)
|
59
|
-
elsif validation.is_a?(Regexp)
|
60
|
-
errors.add(field, :invalid) unless send(field) =~ validation
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
errors.empty?
|
65
|
-
end
|
66
|
-
|
67
|
-
def invalid?
|
68
|
-
!valid?
|
69
|
-
end
|
70
|
-
|
71
|
-
# Always return true so when using form_for, the default method will be post.
|
72
|
-
#
|
73
|
-
def new_record?
|
74
|
-
true
|
75
|
-
end
|
76
|
-
|
77
|
-
# Always return nil so when using form_for, the default method will be post.
|
78
|
-
#
|
79
|
-
def id
|
80
|
-
nil
|
81
|
-
end
|
82
|
-
|
83
|
-
# If is not spam and the form is valid, we send the e-mail and returns true.
|
84
|
-
# Otherwise returns false.
|
85
|
-
#
|
86
|
-
def deliver(run_validations=true)
|
87
|
-
if !run_validations || (self.not_spam? && self.valid?)
|
88
|
-
SimpleForm::Notifier.deliver_contact(self)
|
89
|
-
return true
|
90
|
-
else
|
91
|
-
return false
|
92
|
-
end
|
93
|
-
end
|
94
|
-
alias :save :deliver
|
95
|
-
|
96
|
-
# Add a human attribute name interface on top of I18n. If email is received as
|
97
|
-
# attribute, it will look for a translated name on:
|
98
|
-
#
|
99
|
-
# simple_form:
|
100
|
-
# attributes:
|
101
|
-
# email: E-mail
|
102
|
-
#
|
103
|
-
def self.human_attribute_name(attribute, options={})
|
104
|
-
I18n.translate("attributes.#{attribute}", options.merge(:default => attribute.to_s.humanize, :scope => [:simple_form]))
|
105
|
-
end
|
106
|
-
|
107
|
-
# Add a human name interface on top of I18n. If you have a model named
|
108
|
-
# SimpleForm, it will search for the localized name on:
|
109
|
-
#
|
110
|
-
# simple_form:
|
111
|
-
# models:
|
112
|
-
# contact_form: Contact form
|
113
|
-
#
|
114
|
-
def self.human_name(options={})
|
115
|
-
underscored = self.name.demodulize.underscore
|
116
|
-
I18n.translate("models.#{underscored}", options.merge(:default => underscored.humanize, :scope => [:simple_form]))
|
117
|
-
end
|
118
|
-
|
119
|
-
# Return the errors in this form. The object returned as the same API as the
|
120
|
-
# ActiveRecord one.
|
121
|
-
#
|
122
|
-
def errors
|
123
|
-
@errors ||= SimpleForm::Errors.new(self)
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
data/lib/simple_form/dsl.rb
DELETED
@@ -1,171 +0,0 @@
|
|
1
|
-
class SimpleForm
|
2
|
-
module DSL
|
3
|
-
|
4
|
-
protected
|
5
|
-
|
6
|
-
# Declare your form attributes. All attributes declared here will be appended
|
7
|
-
# to the e-mail, except the ones captcha is true.
|
8
|
-
#
|
9
|
-
# == Options
|
10
|
-
#
|
11
|
-
# * <tt>:validate</tt> - When true, validates the attributes can't be blank.
|
12
|
-
# When a regexp is given, check if the attribute matches is not blank and
|
13
|
-
# then if it matches the regexp.
|
14
|
-
#
|
15
|
-
# Whenever :validate is a symbol, the method given as symbol will be
|
16
|
-
# called. You can then add validations as you do in ActiveRecord (errors.add).
|
17
|
-
#
|
18
|
-
# * <tt>:attachment</tt> - When given, expects a file to be sent and attaches
|
19
|
-
# it to the e-mail. Don't forget to set your form to multitype.
|
20
|
-
#
|
21
|
-
# * <tt>:captcha</tt> - When true, validates the attributes must be blank
|
22
|
-
# This is a simple way to avoid spam
|
23
|
-
#
|
24
|
-
# == Examples
|
25
|
-
#
|
26
|
-
# class ContactForm < SimpleForm
|
27
|
-
# attributes :name, :validate => true
|
28
|
-
# attributes :email, :validate => /^([^@]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
29
|
-
# attributes :message
|
30
|
-
# attributes :type
|
31
|
-
# attributes :screenshot, :attachment => true, :validate => :interface_bug?
|
32
|
-
# attributes :nickname, :captcha => true
|
33
|
-
#
|
34
|
-
# def interface_bug?
|
35
|
-
# if type == 'Interface bug' && screenshot.nil?
|
36
|
-
# self.errors.add(:screenshot, "can't be blank when you are reporting an interface bug")
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
def attribute(*accessors)
|
42
|
-
options = accessors.extract_options!
|
43
|
-
|
44
|
-
attr_accessor *accessors
|
45
|
-
|
46
|
-
if options[:attachment]
|
47
|
-
write_inheritable_array(:form_attachments, accessors)
|
48
|
-
elsif options[:captcha]
|
49
|
-
write_inheritable_array(:form_captcha, accessors)
|
50
|
-
else
|
51
|
-
write_inheritable_array(:form_attributes, accessors)
|
52
|
-
end
|
53
|
-
|
54
|
-
if options[:validate]
|
55
|
-
validations = {}
|
56
|
-
accessors.each{ |a| validations[a] = options[:validate] }
|
57
|
-
|
58
|
-
write_inheritable_hash(:form_validatable, validations)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
alias :attributes :attribute
|
62
|
-
|
63
|
-
# Declares contact email sender. It can be a string or a proc or a symbol.
|
64
|
-
#
|
65
|
-
# When a symbol is given, it will call a method on the form object with
|
66
|
-
# the same name as the symbol. As a proc, it receives a simple form
|
67
|
-
# instance. By default is the class human name.
|
68
|
-
#
|
69
|
-
# == Examples
|
70
|
-
#
|
71
|
-
# class ContactForm < SimpleForm
|
72
|
-
# subject "My Contact Form"
|
73
|
-
# end
|
74
|
-
#
|
75
|
-
def subject(duck=nil, &block)
|
76
|
-
write_inheritable_attribute(:form_subject, duck || block)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Declares contact email sender. It can be a string or a proc or a symbol.
|
80
|
-
#
|
81
|
-
# When a symbol is given, it will call a method on the form object with
|
82
|
-
# the same name as the symbol. As a proc, it receives a simple form
|
83
|
-
# instance. By default is:
|
84
|
-
#
|
85
|
-
# sender{ |c| c.email }
|
86
|
-
#
|
87
|
-
# This requires that your SimpleForm object have an email attribute.
|
88
|
-
#
|
89
|
-
# == Examples
|
90
|
-
#
|
91
|
-
# class ContactForm < SimpleForm
|
92
|
-
# # Change sender to include also the name
|
93
|
-
# sender { |c| %{"#{c.name}" <#{c.email}>} }
|
94
|
-
# end
|
95
|
-
#
|
96
|
-
def sender(duck=nil, &block)
|
97
|
-
write_inheritable_attribute(:form_sender, duck || block)
|
98
|
-
end
|
99
|
-
alias :from :sender
|
100
|
-
|
101
|
-
# Who will receive the e-mail. Can be a string or array or a symbol or a proc.
|
102
|
-
#
|
103
|
-
# When a symbol is given, it will call a method on the form object with
|
104
|
-
# the same name as the symbol. As a proc, it receives a simple form instance.
|
105
|
-
#
|
106
|
-
# Both the proc and the symbol must return a string or an array. By default
|
107
|
-
# is nil.
|
108
|
-
#
|
109
|
-
# == Examples
|
110
|
-
#
|
111
|
-
# class ContactForm < SimpleForm
|
112
|
-
# recipients [ "first.manager@domain.com", "second.manager@domain.com" ]
|
113
|
-
# end
|
114
|
-
#
|
115
|
-
def recipients(duck=nil, &block)
|
116
|
-
write_inheritable_attribute(:form_recipients, duck || block)
|
117
|
-
end
|
118
|
-
alias :to :recipients
|
119
|
-
|
120
|
-
# Additional headers to your e-mail.
|
121
|
-
#
|
122
|
-
# == Examples
|
123
|
-
#
|
124
|
-
# class ContactForm < SimpleForm
|
125
|
-
# headers { :content_type => 'text/html' }
|
126
|
-
# end
|
127
|
-
#
|
128
|
-
def headers(hash)
|
129
|
-
write_inheritable_hash(:form_headers, hash)
|
130
|
-
end
|
131
|
-
|
132
|
-
# Customized template for your e-mail, if you don't want to use default
|
133
|
-
# 'contact' template or need more than one contact form with different
|
134
|
-
# template layouts.
|
135
|
-
#
|
136
|
-
# When a symbol is given, it will call a method on the form object with
|
137
|
-
# the same name as the symbol. As a proc, it receives a simple form
|
138
|
-
# instance. Both method and proc must return a string with the template
|
139
|
-
# name. Defaults to 'contact'.
|
140
|
-
#
|
141
|
-
# == Examples
|
142
|
-
#
|
143
|
-
# class ContactForm < SimpleForm
|
144
|
-
# # look for a template in views/simple_form/notifier/my_template.erb
|
145
|
-
# template 'my_template'
|
146
|
-
# end
|
147
|
-
#
|
148
|
-
def template(new_template)
|
149
|
-
write_inheritable_attribute(:form_template, new_template)
|
150
|
-
end
|
151
|
-
|
152
|
-
# Values from request object to be appended to the contact form.
|
153
|
-
# Whenever used, you have to send the request object when initializing the object:
|
154
|
-
#
|
155
|
-
# @contact_form = ContactForm.new(params[:contact_form], request)
|
156
|
-
#
|
157
|
-
# You can get the values to be appended from the AbstractRequest
|
158
|
-
# documentation (http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html)
|
159
|
-
#
|
160
|
-
# == Examples
|
161
|
-
#
|
162
|
-
# class ContactForm < SimpleForm
|
163
|
-
# append :remote_ip, :user_agent, :session, :cookies
|
164
|
-
# end
|
165
|
-
#
|
166
|
-
def append(*values)
|
167
|
-
write_inheritable_array(:form_appendable, values)
|
168
|
-
end
|
169
|
-
|
170
|
-
end
|
171
|
-
end
|
data/lib/simple_form/errors.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
# Provides an Errors class similar with ActiveRecord ones.
|
2
|
-
#
|
3
|
-
# class ContactForm < SimpleForm
|
4
|
-
# attributes :name, :validate => true
|
5
|
-
# attributes :email, :validate => /^([^@]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
6
|
-
# attributes :message
|
7
|
-
# attributes :nickname, :captcha => true
|
8
|
-
# end
|
9
|
-
#
|
10
|
-
# When validating an attribute name as above, it will search for messages in
|
11
|
-
# the following order:
|
12
|
-
#
|
13
|
-
# simple_form.messages.name
|
14
|
-
# simple_form.messages.blank
|
15
|
-
#
|
16
|
-
# When validating email, it will search for:
|
17
|
-
#
|
18
|
-
# simple_form.messages.name
|
19
|
-
# simple_form.messages.invalid
|
20
|
-
#
|
21
|
-
# If the message is not available, it will output: "can't be blank" in the first
|
22
|
-
# case and "is invalid" in the second.
|
23
|
-
#
|
24
|
-
class SimpleForm
|
25
|
-
class Errors < Hash
|
26
|
-
|
27
|
-
def initialize(base, *args)
|
28
|
-
@base = base
|
29
|
-
super(*args)
|
30
|
-
end
|
31
|
-
|
32
|
-
alias :add :store
|
33
|
-
alias :count :size
|
34
|
-
alias :get :[]
|
35
|
-
|
36
|
-
def on(attribute)
|
37
|
-
attribute = attribute.to_sym
|
38
|
-
return nil unless get(attribute)
|
39
|
-
|
40
|
-
generate_message_for(attribute, get(attribute))
|
41
|
-
end
|
42
|
-
alias :[] :on
|
43
|
-
|
44
|
-
def full_messages
|
45
|
-
map do |attribute, message|
|
46
|
-
next if message.nil?
|
47
|
-
attribute = attribute.to_sym
|
48
|
-
"#{@base.class.human_attribute_name(attribute)} #{generate_message_for(attribute, message)}"
|
49
|
-
end.compact.reverse
|
50
|
-
end
|
51
|
-
|
52
|
-
protected
|
53
|
-
|
54
|
-
def generate_message_for(attribute, message)
|
55
|
-
I18n.t(attribute, :default => [ message, DEFAULT_MESSAGES[message] ], :scope => [:simple_form, :messages])
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
end
|
data/lib/simple_form/notifier.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# This is the class responsable to send the e-mails.
|
2
|
-
#
|
3
|
-
class SimpleForm
|
4
|
-
class Notifier < ActionMailer::Base
|
5
|
-
|
6
|
-
def contact(form)
|
7
|
-
@from = get_from_class_and_eval(form, :form_sender)
|
8
|
-
@subject = get_from_class_and_eval(form, :form_subject)
|
9
|
-
@recipients = get_from_class_and_eval(form, :form_recipients)
|
10
|
-
@template = get_from_class_and_eval(form, :form_template)
|
11
|
-
|
12
|
-
raise ScriptError, "You forgot to setup #{form.class.name} recipients" if @recipients.blank?
|
13
|
-
raise ScriptError, "You set :append values but forgot to give me the request object" if form.request.nil? && !form.class.form_appendable.blank?
|
14
|
-
|
15
|
-
@body['form'] = form
|
16
|
-
@body['subject'] = @subject
|
17
|
-
|
18
|
-
@sent_on = Time.now.utc
|
19
|
-
@headers = form.class.form_headers
|
20
|
-
@content_type = 'text/html'
|
21
|
-
|
22
|
-
form.class.form_attachments.each do |attribute|
|
23
|
-
value = form.send(attribute)
|
24
|
-
if value.respond_to?(:read)
|
25
|
-
attachment value.content_type.to_s do |att|
|
26
|
-
att.filename = value.original_filename
|
27
|
-
att.body = value.read
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
protected
|
34
|
-
|
35
|
-
def get_from_class_and_eval(form, method)
|
36
|
-
duck = form.class.send(method)
|
37
|
-
|
38
|
-
if duck.is_a?(Proc)
|
39
|
-
duck.call(form)
|
40
|
-
elsif duck.is_a?(Symbol)
|
41
|
-
form.send(duck)
|
42
|
-
else
|
43
|
-
duck
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
data/lib/simple_form/version.rb
DELETED
data/test/base_test.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
class SimpleFormBaseTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
ActionMailer::Base.deliveries = []
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_id_is_nil
|
10
|
-
assert_equal nil, ContactForm.new.id
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_is_always_a_new_record
|
14
|
-
assert ContactForm.new.new_record?
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_initialize_with_options
|
18
|
-
form = ContactForm.new(:name => 'José', :email => 'jose@my.email.com')
|
19
|
-
assert_equal 'José', form.name
|
20
|
-
assert_equal 'jose@my.email.com', form.email
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_spam_is_true_when_captcha_field_is_set
|
24
|
-
form = ContactForm.new(:nickname => 'not_blank')
|
25
|
-
assert form.spam?
|
26
|
-
assert !form.not_spam?
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_spam_is_false_when_captcha_field_is_not_set
|
30
|
-
form = ContactForm.new
|
31
|
-
assert !form.spam?
|
32
|
-
assert form.not_spam?
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_is_not_valid_when_validatable_attributes_are_blank
|
36
|
-
form = ContactForm.new
|
37
|
-
assert !form.valid?
|
38
|
-
assert form.invalid?
|
39
|
-
|
40
|
-
assert_equal(2, form.errors.count)
|
41
|
-
assert_equal({:email=>:blank, :name=>:blank}, form.errors)
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_is_not_valid_when_validatable_regexp_does_not_match
|
45
|
-
form = ContactForm.new(:name => 'Jose', :email => 'not_valid')
|
46
|
-
assert !form.valid?
|
47
|
-
assert form.invalid?
|
48
|
-
|
49
|
-
assert_equal(1, form.errors.count)
|
50
|
-
assert_equal({:email=>:invalid}, form.errors)
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_is_valid_when_validatable_attributes_are_valid
|
54
|
-
form = ContactForm.new(:name => 'Jose', :email => 'is.valid@email.com')
|
55
|
-
assert form.valid?
|
56
|
-
assert !form.invalid?
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_symbols_given_to_validate_are_called
|
60
|
-
form = ContactForm.new
|
61
|
-
assert form.instance_variable_get('@_callback_run').nil?
|
62
|
-
form.valid?
|
63
|
-
assert form.instance_variable_get('@_callback_run')
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_deliver_is_false_when_is_a_spam
|
67
|
-
form = ContactForm.new(:name => 'Jose', :email => 'is.valid@email.com', :nickname => 'not_blank')
|
68
|
-
assert form.valid?
|
69
|
-
assert form.spam?
|
70
|
-
assert !form.deliver
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_deliver_is_false_when_is_invalid
|
74
|
-
form = ContactForm.new(:name => 'Jose', :email => 'is.com')
|
75
|
-
assert form.invalid?
|
76
|
-
assert form.not_spam?
|
77
|
-
assert !form.deliver
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_deliver_is_true_when_is_not_spam_and_valid
|
81
|
-
form = ContactForm.new(:name => 'Jose', :email => 'is.valid@email.com')
|
82
|
-
assert form.valid?
|
83
|
-
assert form.not_spam?
|
84
|
-
assert form.deliver
|
85
|
-
assert_equal 1, ActionMailer::Base.deliveries.size
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_human_name_returns_a_humanized_name
|
89
|
-
assert_equal 'Contact form', ContactForm.human_name
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_human_name_can_be_localized
|
93
|
-
I18n.backend.store_translations(:en, :simple_form => { :models => { :contact_form => 'Formulário de contato' } })
|
94
|
-
assert_equal 'Formulário de contato', ContactForm.human_name
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_human_attribute_name_returns_a_humanized_attribute
|
98
|
-
assert_equal 'Message', ContactForm.human_attribute_name(:message)
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_human_attribute_name_can_be_localized
|
102
|
-
I18n.backend.store_translations(:en, :simple_form => { :attributes => { :message => 'Mensagem' } })
|
103
|
-
assert_equal 'Mensagem', ContactForm.human_attribute_name(:message)
|
104
|
-
end
|
105
|
-
|
106
|
-
def teardown
|
107
|
-
I18n.reload!
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
data/test/errors_test.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
class SimpleFormErrorsTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
def test_errors_respond_to_some_hash_methods
|
6
|
-
assert ContactForm.new.errors.respond_to?(:each)
|
7
|
-
assert ContactForm.new.errors.respond_to?(:each_pair)
|
8
|
-
assert ContactForm.new.errors.respond_to?(:size)
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_count_is_an_alias_to_size
|
12
|
-
errors = ContactForm.new.errors
|
13
|
-
assert_equal errors.size, errors.count
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_on_returns_the_message_in_the_given_attribute
|
17
|
-
form = ContactForm.new(:email => 'not_valid')
|
18
|
-
form.valid?
|
19
|
-
assert_equal "can't be blank", form.errors.on(:name)
|
20
|
-
assert_equal "is invalid", form.errors.on(:email)
|
21
|
-
assert_equal nil, form.errors.on(:message)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_on_returns_a_default_localized_message_in_the_given_attribute
|
25
|
-
I18n.backend.store_translations(:en, :simple_form => { :messages => { :invalid => 'is not valid', :blank => 'should be filled' } })
|
26
|
-
|
27
|
-
form = ContactForm.new(:email => 'not_valid')
|
28
|
-
form.valid?
|
29
|
-
|
30
|
-
assert_equal "should be filled", form.errors.on(:name)
|
31
|
-
assert_equal "is not valid", form.errors.on(:email)
|
32
|
-
assert_equal nil, form.errors.on(:message)
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_on_returns_an_attribute_localized_message_in_the_given_attribute
|
36
|
-
I18n.backend.store_translations(:en, :simple_form => { :messages => { :email => 'fill in the email', :name => 'fill in the name' } })
|
37
|
-
|
38
|
-
form = ContactForm.new(:email => 'not_valid')
|
39
|
-
form.valid?
|
40
|
-
|
41
|
-
assert_equal "fill in the name", form.errors.on(:name)
|
42
|
-
assert_equal "fill in the email", form.errors.on(:email)
|
43
|
-
assert_equal nil, form.errors.on(:message)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_array_like_option_acts_as_an_alias_for_on
|
47
|
-
form = ContactForm.new(:email => 'not_valid')
|
48
|
-
form.valid?
|
49
|
-
assert_equal "can't be blank", form.errors[:name]
|
50
|
-
assert_equal form.errors.on(:name), form.errors[:name]
|
51
|
-
assert_equal "is invalid", form.errors[:email]
|
52
|
-
assert_equal form.errors.on(:email), form.errors[:email]
|
53
|
-
assert_equal nil, form.errors[:message]
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_get_returns_the_real_value_in_the_given_attribute
|
57
|
-
form = ContactForm.new(:email => 'not_valid')
|
58
|
-
form.valid?
|
59
|
-
assert_equal :blank, form.errors.get(:name)
|
60
|
-
assert_equal :invalid, form.errors.get(:email)
|
61
|
-
assert_equal nil, form.errors.get(:message)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_full_messages
|
65
|
-
form = ContactForm.new(:email => 'not_valid')
|
66
|
-
form.valid?
|
67
|
-
|
68
|
-
assert form.errors.full_messages.include?("Name can't be blank")
|
69
|
-
assert form.errors.full_messages.include?("Email is invalid")
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_full_localized_messages
|
73
|
-
I18n.backend.store_translations(:en, :simple_form => { :messages => { :email => 'is not valid', :blank => 'should be filled' }, :attributes => { :email => 'E-mail' } })
|
74
|
-
|
75
|
-
form = ContactForm.new(:email => 'not_valid')
|
76
|
-
form.valid?
|
77
|
-
|
78
|
-
assert form.errors.full_messages.include?("Name should be filled")
|
79
|
-
assert form.errors.full_messages.include?("E-mail is not valid")
|
80
|
-
end
|
81
|
-
|
82
|
-
def teardown
|
83
|
-
I18n.reload!
|
84
|
-
end
|
85
|
-
end
|
data/test/notifier_test.rb
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
class SimpleFormNotifierTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@form = ContactForm.new(:name => 'José', :email => 'my.email@my.domain.com', :message => 'Cool')
|
7
|
-
|
8
|
-
@request = ActionController::TestRequest.new
|
9
|
-
@valid_attributes = { :name => 'José', :email => 'my.email@my.domain.com', :message => "Cool\nno?" }
|
10
|
-
@advanced = AdvancedForm.new(@valid_attributes, @request)
|
11
|
-
|
12
|
-
test_file = ActionController::TestUploadedFile.new(File.join(File.dirname(__FILE__), 'test_file.txt'))
|
13
|
-
@with_file = FileForm.new(:name => 'José', :email => 'my.email@my.domain.com', :message => "Cool", :file => test_file)
|
14
|
-
|
15
|
-
@template = TemplateForm.new(@valid_attributes)
|
16
|
-
|
17
|
-
ActionMailer::Base.deliveries = []
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_email_is_sent
|
21
|
-
@form.deliver
|
22
|
-
assert_equal 1, ActionMailer::Base.deliveries.size
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_subject_defaults_to_class_human_name
|
26
|
-
@form.deliver
|
27
|
-
assert_equal 'Contact form', ActionMailer::Base.deliveries.first.subject
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_subject_is_a_string
|
31
|
-
@advanced.deliver
|
32
|
-
assert_equal 'My Advanced Form', ActionMailer::Base.deliveries.first.subject
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_sender_defaults_to_form_email
|
36
|
-
@form.deliver
|
37
|
-
assert_equal ['my.email@my.domain.com'], ActionMailer::Base.deliveries.first.from
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_error_is_raised_when_recipients_is_nil
|
41
|
-
assert_raise ScriptError do
|
42
|
-
NullRecipient.new.deliver
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_recipients_is_a_string
|
47
|
-
@form.deliver
|
48
|
-
assert_equal ['my.email@my.domain.com'], ActionMailer::Base.deliveries.first.to
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_recipients_is_an_array
|
52
|
-
@advanced.deliver
|
53
|
-
assert_equal ['my.first@email.com', 'my.second@email.com'], ActionMailer::Base.deliveries.first.to
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_recipients_is_a_symbold
|
57
|
-
@with_file.deliver
|
58
|
-
assert_equal ['contact_file@my.domain.com'], ActionMailer::Base.deliveries.first.to
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_headers_is_a_hash
|
62
|
-
@advanced.deliver
|
63
|
-
assert_equal '<mypath>', ActionMailer::Base.deliveries.first.header['return-path'].to_s
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_body_contains_subject
|
67
|
-
@form.deliver
|
68
|
-
assert_match /Contact form/, ActionMailer::Base.deliveries.first.body
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_body_contains_attributes_values
|
72
|
-
@form.deliver
|
73
|
-
assert_match /José/, ActionMailer::Base.deliveries.first.body
|
74
|
-
assert_match /my.email@my.domain.com/, ActionMailer::Base.deliveries.first.body
|
75
|
-
assert_match /Cool/, ActionMailer::Base.deliveries.first.body
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_body_contains_attributes_names
|
79
|
-
@form.deliver
|
80
|
-
assert_match /Name:/, ActionMailer::Base.deliveries.first.body
|
81
|
-
assert_match /Email:/, ActionMailer::Base.deliveries.first.body
|
82
|
-
assert_match /Message:/, ActionMailer::Base.deliveries.first.body
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_body_contains_localized_attributes_names
|
86
|
-
I18n.backend.store_translations(:en, :simple_form => { :attributes => { :message => 'Sent message' } })
|
87
|
-
@form.deliver
|
88
|
-
assert_match /Sent message:/, ActionMailer::Base.deliveries.first.body
|
89
|
-
assert_no_match /Message:/, ActionMailer::Base.deliveries.first.body
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_body_simple_format_messages_with_break_line
|
93
|
-
@form.deliver
|
94
|
-
assert_no_match /<p>Cool/, ActionMailer::Base.deliveries.first.body
|
95
|
-
|
96
|
-
@advanced.deliver
|
97
|
-
assert_match /<p>Cool/, ActionMailer::Base.deliveries.last.body
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_body_does_not_append_request_if_append_is_not_called
|
101
|
-
@form.deliver
|
102
|
-
assert_no_match /Request information/, ActionMailer::Base.deliveries.first.body
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_body_does_append_request_if_append_is_called
|
106
|
-
@advanced.deliver
|
107
|
-
assert_match /Request information/, ActionMailer::Base.deliveries.last.body
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_request_title_is_localized
|
111
|
-
I18n.backend.store_translations(:en, :simple_form => { :request => { :title => 'Information about the request' } })
|
112
|
-
@advanced.deliver
|
113
|
-
assert_no_match /Request information/, ActionMailer::Base.deliveries.last.body
|
114
|
-
assert_match /Information about the request/, ActionMailer::Base.deliveries.last.body
|
115
|
-
end
|
116
|
-
|
117
|
-
def test_request_info_attributes_are_printed
|
118
|
-
@advanced.deliver
|
119
|
-
assert_match /Remote ip/, ActionMailer::Base.deliveries.last.body
|
120
|
-
assert_match /User agent/, ActionMailer::Base.deliveries.last.body
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_request_info_attributes_are_localized
|
124
|
-
I18n.backend.store_translations(:en, :simple_form => { :request => { :remote_ip => 'IP Address' } })
|
125
|
-
@advanced.deliver
|
126
|
-
assert_match /IP Address/, ActionMailer::Base.deliveries.last.body
|
127
|
-
assert_no_match /Remote ip/, ActionMailer::Base.deliveries.last.body
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_request_info_values_are_printed
|
131
|
-
@advanced.deliver
|
132
|
-
assert_match /0\.0\.0\.0/, ActionMailer::Base.deliveries.last.body
|
133
|
-
assert_match /Rails Testing/, ActionMailer::Base.deliveries.last.body
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_request_info_hashes_are_print_inside_lis
|
137
|
-
@request.session = { :my => :session, :user => "data" }
|
138
|
-
@advanced.deliver
|
139
|
-
assert_match /<li>my: :session<\/li>/, ActionMailer::Base.deliveries.last.body
|
140
|
-
assert_match /<li>user: "data"<\/li>/, ActionMailer::Base.deliveries.last.body
|
141
|
-
end
|
142
|
-
|
143
|
-
def test_error_is_raised_when_append_is_given_but_no_request_is_given
|
144
|
-
assert_raise ScriptError do
|
145
|
-
@advanced.request = nil
|
146
|
-
@advanced.deliver
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_form_with_file_includes_an_attachment
|
151
|
-
@with_file.deliver
|
152
|
-
|
153
|
-
#For some reason I need to encode the mail before the attachments array returns values
|
154
|
-
ActionMailer::Base.deliveries.first.to_s
|
155
|
-
assert_equal 1, ActionMailer::Base.deliveries.first.attachments.size
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_form_with_file_does_not_output_attachment_as_attribute
|
159
|
-
@with_file.deliver
|
160
|
-
assert_no_match /File/, ActionMailer::Base.deliveries.first.body
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_form_with_customized_template_raise_missing_template_if_not_found
|
164
|
-
assert_raise ActionView::MissingTemplate do
|
165
|
-
@template.deliver
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def test_form_with_customized_template_render_correct_template
|
170
|
-
begin
|
171
|
-
default_template_root = SimpleForm::Notifier.template_root
|
172
|
-
SimpleForm::Notifier.template_root = File.join(File.dirname(__FILE__), 'views')
|
173
|
-
@template.deliver
|
174
|
-
assert_match 'Hello from my cystom template!', ActionMailer::Base.deliveries.last.body
|
175
|
-
ensure
|
176
|
-
SimpleForm::Notifier.template_root = default_template_root
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def teardown
|
181
|
-
I18n.reload!
|
182
|
-
end
|
183
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'rubygems'
|
3
|
-
|
4
|
-
RAILS_ENV = ENV["RAILS_ENV"] = "test"
|
5
|
-
|
6
|
-
require 'active_support'
|
7
|
-
require 'active_support/test_case'
|
8
|
-
require 'action_mailer'
|
9
|
-
require 'action_controller/test_case'
|
10
|
-
|
11
|
-
ActionMailer::Base.delivery_method = :test
|
12
|
-
|
13
|
-
# Load respond_to before defining ApplicationController
|
14
|
-
require File.dirname(__FILE__) + '/../lib/simple_form.rb'
|
15
|
-
|
16
|
-
class ContactForm < SimpleForm
|
17
|
-
recipients 'my.email@my.domain.com'
|
18
|
-
|
19
|
-
attribute :name, :validate => true
|
20
|
-
attribute :email, :validate => /[^@]+@[^\.]+\.[\w\.\-]+/
|
21
|
-
attribute :nickname, :captcha => true
|
22
|
-
attributes :tellphone, :message, :validate => :callback
|
23
|
-
|
24
|
-
def callback
|
25
|
-
@_callback_run = true
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class AdvancedForm < ContactForm
|
30
|
-
append :remote_ip, :user_agent, :session
|
31
|
-
|
32
|
-
recipients [ 'my.first@email.com', 'my.second@email.com' ]
|
33
|
-
subject 'My Advanced Form'
|
34
|
-
sender{|c| %{"#{c.name}" <#{c.email}>} }
|
35
|
-
headers 'return-path' => 'mypath'
|
36
|
-
end
|
37
|
-
|
38
|
-
class FileForm < ContactForm
|
39
|
-
attribute :file, :attachment => true, :validate => true
|
40
|
-
recipients :set_recipient
|
41
|
-
|
42
|
-
def set_recipient
|
43
|
-
if file
|
44
|
-
"contact_file@my.domain.com"
|
45
|
-
else
|
46
|
-
"contact@my.domain.com"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class NullRecipient < SimpleForm
|
52
|
-
sender 'my.email@my.domain.com'
|
53
|
-
end
|
54
|
-
|
55
|
-
class TemplateForm < ContactForm
|
56
|
-
template 'custom_template'
|
57
|
-
end
|
58
|
-
|
59
|
-
# Needed to correctly test an uploaded file
|
60
|
-
class ActionController::TestUploadedFile
|
61
|
-
def read
|
62
|
-
@tempfile.read
|
63
|
-
end
|
64
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
<h4 style="text-decoration:underline"><%=h @subject %></h4>
|
2
|
-
|
3
|
-
<% @form.class.form_attributes.each do |attribute|
|
4
|
-
value = @form.send(attribute)
|
5
|
-
next if value.blank? %>
|
6
|
-
|
7
|
-
<p><b><%= @form.class.human_attribute_name(attribute) %>:</b>
|
8
|
-
<%= value.include?("\n") ? simple_format(h(value)) : h(value) %></p>
|
9
|
-
<% end %>
|
10
|
-
|
11
|
-
<% unless @form.class.form_appendable.blank? %>
|
12
|
-
<br /><h4 style="text-decoration:underline"><%= I18n.t :title, :scope => [ :simple_form, :request ], :default => 'Request information' %></h4>
|
13
|
-
|
14
|
-
<% @form.class.form_appendable.each do |attribute|
|
15
|
-
value = @form.request.send(attribute)
|
16
|
-
|
17
|
-
value = if value.is_a?(Hash) && !value.empty?
|
18
|
-
content_tag(:ul, value.to_a.map{|k,v| content_tag(:li, h("#{k}: #{v.inspect}")) }.join("\n"), :style => "list-style:none;")
|
19
|
-
elsif value.is_a?(String)
|
20
|
-
h(value)
|
21
|
-
else
|
22
|
-
h(value.inspect)
|
23
|
-
end
|
24
|
-
%>
|
25
|
-
|
26
|
-
<p><b><%= I18n.t attribute, :scope => [ :simple_form, :request ], :default => attribute.to_s.humanize %>:</b>
|
27
|
-
<%= value.include?("\n") ? simple_format(value) : value %></p>
|
28
|
-
<% end %>
|
29
|
-
<br />
|
30
|
-
<% end %>
|