@@ -64,6 +64,7 @@ gem 'gibbon' |
||
64 | 64 |
gem 'redis' |
65 | 65 |
gem 'resque', '~> 1.22.0', :require => "resque/server" |
66 | 66 |
gem 'mixpanel-ruby' |
67 |
+gem 'valid_email', :require => 'valid_email/email_validator' |
|
67 | 68 |
|
68 | 69 |
group :development do |
69 | 70 |
gem "rename" |
@@ -119,7 +119,6 @@ GEM |
||
119 | 119 |
formatador (0.2.5) |
120 | 120 |
friendly_id (5.0.4) |
121 | 121 |
activerecord (>= 4.0.0) |
122 |
- geocoder (1.2.6) |
|
123 | 122 |
gherkin (2.12.2) |
124 | 123 |
multi_json (~> 1.3) |
125 | 124 |
gibbon (1.1.4) |
@@ -287,6 +286,9 @@ GEM |
||
287 | 286 |
kgio (~> 2.6) |
288 | 287 |
rack |
289 | 288 |
raindrops (~> 0.7) |
289 |
+ valid_email (0.0.7) |
|
290 |
+ activemodel |
|
291 |
|
|
290 | 292 |
vegas (0.1.11) |
291 | 293 |
rack (>= 1.0.0) |
292 | 294 |
warden (1.2.3) |
@@ -315,7 +317,6 @@ DEPENDENCIES |
||
315 | 317 |
fog |
316 | 318 |
font-awesome-rails |
317 | 319 |
friendly_id (~> 5.0.0) |
318 |
- geocoder |
|
319 | 320 |
gibbon |
320 | 321 |
jasny_bootstrap_extension_rails |
321 | 322 |
jbuilder (~> 1.2) |
@@ -345,3 +346,4 @@ DEPENDENCIES |
||
345 | 346 |
twitter-bootstrap-rails |
346 | 347 |
uglifier (>= 1.3.0) |
347 | 348 |
unicorn |
349 |
+ valid_email |
@@ -18,6 +18,39 @@ function attachHandler(jQuery) { |
||
18 | 18 |
|
19 | 19 |
$('.popup').popover('toogle') |
20 | 20 |
|
21 |
+ $('.new_subscription').submit(function() { |
|
22 |
+ var valuesToSubmit = $(this).serialize(); |
|
23 |
+ $.ajax({ |
|
24 |
+ type: "POST", |
|
25 |
+ url: $(this).attr('action'), |
|
26 |
+ data: valuesToSubmit, |
|
27 |
+ dataType: "json", |
|
28 |
+ async: true, |
|
29 |
+ error: function(request, textStatus, errorThrown){ |
|
30 |
+ msg = '<div class="alert alert-error span5 subscribe-alert"><h4>' + request.status + " " + errorThrown + '</h4></div>' |
|
31 |
+ $('.new_subscription').html(msg); |
|
32 |
+ }, |
|
33 |
+ success: function(data){ |
|
34 |
+ $('.subscribe-alert').remove(); |
|
35 |
+ switch(data.status) { |
|
36 |
+ case 'success': |
|
37 |
+ msg = '<div class="alert alert-success subscribe-alert"><h4>' + data.success + '</h4></div>'; |
|
38 |
+ $('.new_subscription').html(msg); |
|
39 |
+ break; |
|
40 |
+ case 'error': |
|
41 |
+ msg = '<div class="alert alert-success subscribe-alert"><h4>' + data.error + '</h4></div>'; |
|
42 |
+ $('.new_subscription').html(msg); |
|
43 |
+ break; |
|
44 |
+ case 'invalid': |
|
45 |
+ msg = '<div class="alert alert-block subscribe-alert"><h4>' + data.invalid + '</h4></div>'; |
|
46 |
+ $('.new_subscription').prepend(msg); |
|
47 |
+ break; |
|
48 |
+ } |
|
49 |
+ } |
|
50 |
+ }); |
|
51 |
+ return false; |
|
52 |
+ }); |
|
53 |
+ |
|
21 | 54 |
// on scroll, |
22 | 55 |
$(window).on('scroll',function(){ |
23 | 56 |
|
@@ -235,6 +235,11 @@ background-color: #444; |
||
235 | 235 |
color: white; |
236 | 236 |
} |
237 | 237 |
|
238 |
+.subscribe-alert { |
|
239 |
+ margin-left: 0px; |
|
240 |
+ width: 560px; |
|
241 |
+} |
|
242 |
+ |
|
238 | 243 |
@media (max-width: 979px) { |
239 | 244 |
h2.landing_page { |
240 | 245 |
font-size: 26px; |
@@ -1,17 +1,23 @@ |
||
1 |
+require 'valid_email' |
|
2 |
+ |
|
1 | 3 |
class SubscriptionController < ApplicationController |
2 | 4 |
|
3 | 5 |
def create |
4 | 6 |
@subscription = Subscription.new(subscription_params) |
7 |
+ @subscribe_status = 'error' |
|
5 | 8 |
respond_to do |format| |
6 |
- if Subscription.find_by_email(@subscription.email) == nil |
|
9 |
+ if Subscription.find_by_email(@subscription.email) == nil && @subscription.valid? |
|
7 | 10 |
if @subscription.save |
11 |
+ @subscribe_status = 'success' |
|
8 | 12 |
format.html { redirect_to root_path, notice: 'Thanks for subscribing to our newsletter' } |
9 |
- format.json { render action: 'show', status: :created, location: @subscription } |
|
13 |
+ format.json { render action: 'show', status: :created } |
|
10 | 14 |
else |
15 |
+ @subscribe_status = 'error' |
|
11 | 16 |
format.html { redirect_to root_path, alert: 'An error ocured. Please try gain.' } |
12 |
- format.json { render json: @subscription.errors, status: :unprocessable_entity } |
|
17 |
+ format.json { render action: 'show', status: :created, location: @subscription } |
|
13 | 18 |
end |
14 | 19 |
else |
20 |
+ @subscribe_status = 'invalid' |
|
15 | 21 |
format.html { redirect_to root_path, alert: 'You have already registered to our newsletter' } |
16 | 22 |
format.json { render action: 'show', status: :created, location: @subscription } |
17 | 23 |
end |
@@ -1,5 +1,7 @@ |
||
1 | 1 |
class Subscription < ActiveRecord::Base |
2 | 2 |
|
3 |
+ validates :email, :presence => true, :email => true |
|
4 |
+ |
|
3 | 5 |
after_create do |
4 | 6 |
subscribe_to_mailchimp |
5 | 7 |
send_newsletter_subscription_email |
@@ -35,6 +35,8 @@ |
||
35 | 35 |
<%= favicon_link_tag 'favicon.ico', :rel => 'shortcut icon' %> |
36 | 36 |
|
37 | 37 |
<%= javascript_include_tag "application" %> |
38 |
+ |
|
39 |
+ <%= favicon_link_tag 'favicon.ico' %> |
|
38 | 40 |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
39 | 41 |
|
40 | 42 |
<script src='https://api.tiles.mapbox.com/mapbox.js/v2.1.4/mapbox.js'></script> |
@@ -103,7 +105,7 @@ |
||
103 | 105 |
|
104 | 106 |
<div> |
105 | 107 |
|
106 |
- <%= bootstrap_flash %> |
|
108 |
+ |
|
107 | 109 |
<%= yield %> |
108 | 110 |
|
109 | 111 |
|
@@ -239,10 +239,10 @@ |
||
239 | 239 |
<p class="lead header "> |
240 | 240 |
<%= (t "landing_page.subscribe_text").html_safe %> |
241 | 241 |
</p> |
242 |
- <%= bootstrap_form_for(@subscription) do |f| %> |
|
242 |
+ <%= bootstrap_form_for(@subscription, remote: true) do |f| %> |
|
243 | 243 |
<%= f.alert_message "Please fix the errors below."%> |
244 | 244 |
<%= f.form_group :email, style: 'margin-top: -35px;' do %> |
245 |
- <%= f.text_field :email, hide_label: true, value: 'Email', class: 'span4 input-large', required: true, style: 'height: 30px; font-size: 24px;' %> |
|
245 |
+ <%= f.text_field :email, hide_label: true, placeholder: 'Email', class: 'span4 input-large', required: true, style: 'height: 30px; font-size: 24px; padding-top: 10px;' %> |
|
246 | 246 |
<% end %> |
247 | 247 |
<%= f.submit (t 'subscription.submit'), class: 'btn btn-large', id: 'submit_subscription' %> |
248 | 248 |
<% end %> |
@@ -279,10 +279,10 @@ |
||
279 | 279 |
<p class="lead" > |
280 | 280 |
<%= (t "landing_page.subscribe_text").html_safe %> |
281 | 281 |
</p> |
282 |
- <%= bootstrap_form_for(@subscription) do |f| %> |
|
282 |
+ <%= bootstrap_form_for(@subscription, remote: true) do |f| %> |
|
283 | 283 |
<%= f.alert_message "Please fix the errors below."%> |
284 | 284 |
<%= f.form_group :email, style: 'margin-top: -35px;' do %> |
285 |
- <%= f.text_field :email, hide_label: true, value: 'Email', class: 'span4', required: true, style: 'height: 50px; font-size: 24px;' %> |
|
285 |
+ <%= f.text_field :email, hide_label: true, placeholder: 'Email', class: 'span4', required: true, style: 'height: 50px; font-size: 24px; padding-top: 5px;' %> |
|
286 | 286 |
<% end %> |
287 | 287 |
<%= f.submit (t 'subscription.submit'), class: 'btn btn-large', id: 'submit_subscription' %> |
288 | 288 |
<% end %> |
@@ -0,0 +1,6 @@ |
||
1 |
+{ |
|
2 |
+ "status": "<%= @subscribe_status %>", |
|
3 |
+ "success": "<%= t 'subscription.success' %>", |
|
4 |
+ "failure": "<%= t 'subscription.failure' %>", |
|
5 |
+ "invalid": "<%= t 'subscription.invalid' %>" |
|
6 |
+} |
@@ -301,4 +301,7 @@ en: |
||
301 | 301 |
subscribers: Subscribers |
302 | 302 |
header: Subscribe to our newsletter |
303 | 303 |
submit: Subscribe |
304 |
- export: Export CVS |
|
304 |
+ export: Export CVS |
|
305 |
+ success: 'Thanks for subscribing to our newsletter!' |
|
306 |
+ failure: 'An error ocured! Please try again later.' |
|
307 |
+ invalid: 'The email you entered is not valid.' |
@@ -305,4 +305,7 @@ pt-BR: |
||
305 | 305 |
subscribers: Assinantes |
306 | 306 |
header: Receba nossa newsletter |
307 | 307 |
submit: Enviar |
308 |
- export: Exportart CVS |
|
308 |
+ export: Exportart CVS |
|
309 |
+ success: 'Obrigado por se cadastrar na nossa newsletter!' |
|
310 |
+ failure: 'Ocorreu um erro. Por favor tente de novo mais tarde.' |
|
311 |
+ invalid: 'O endereço de email não é valido.' |
@@ -6,13 +6,10 @@ timeout 30 |
||
6 | 6 |
preload_app true |
7 | 7 |
|
8 | 8 |
before_fork do |server, worker| |
9 |
- # Replace with MongoDB or whatever |
|
10 | 9 |
if defined?(ActiveRecord::Base) |
11 | 10 |
ActiveRecord::Base.connection.disconnect! |
12 | 11 |
Rails.logger.info('Disconnected from ActiveRecord') |
13 | 12 |
end |
14 |
- |
|
15 |
- # If you are using Redis but not Resque, change this |
|
16 | 13 |
if defined?(Resque) |
17 | 14 |
Resque.redis.quit |
18 | 15 |
Rails.logger.info('Disconnected from Redis') |
@@ -20,13 +17,10 @@ before_fork do |server, worker| |
||
20 | 17 |
end |
21 | 18 |
|
22 | 19 |
after_fork do |server, worker| |
23 |
- # Replace with MongoDB or whatever |
|
24 | 20 |
if defined?(ActiveRecord::Base) |
25 | 21 |
ActiveRecord::Base.establish_connection |
26 | 22 |
Rails.logger.info('Connected to ActiveRecord') |
27 | 23 |
end |
28 |
- |
|
29 |
- # If you are using Redis but not Resque, change this |
|
30 | 24 |
if defined?(Resque) |
31 | 25 |
Resque.redis = REDIS_WORKER |
32 | 26 |
@resque_pid ||= spawn("bundle exec rake resque:work") |