1
0
mirror of https://github.com/danbee/danbarberphoto synced 2025-03-04 08:49:07 +00:00

Added jQuery validation on the contact form via jquery.validate.

This commit is contained in:
Dan Barber 2010-10-14 14:38:10 -04:00
parent 5c4e32756b
commit 3183974820
13 changed files with 201 additions and 127 deletions

View File

@ -30,6 +30,7 @@ gem 'sqlite3-ruby', :require => 'sqlite3'
# end
gem "exception_notification", :git => "git://github.com/rails/exception_notification", :require => 'exception_notifier'
gem 'validates_email_format_of', :git => 'http://github.com/alexdunae/validates_email_format_of.git'
gem 'pg'
gem 'typus', :git => 'git://github.com/fesplugas/typus.git'
gem 'mini_exiftool'

View File

@ -10,6 +10,12 @@ GIT
specs:
exception_notification (1.0.0)
GIT
remote: http://github.com/alexdunae/validates_email_format_of.git
revision: 39750a7462028c25c387074744eee4b01d09f5a5
specs:
validates_email_format_of (1.4.1)
GIT
remote: http://github.com/mislav/will_paginate.git
revision: b1a5beeec9f56ecbe3594fcdca76d92b6767ce50
@ -98,4 +104,5 @@ DEPENDENCIES
rdiscount
sqlite3-ruby
typus!
validates_email_format_of!
will_paginate!

Binary file not shown.

View File

@ -1,8 +1,12 @@
require 'email_validator'
class Contact
include ActiveModel::Validations
validates_presence_of :email, :name, :message
validates :email, :email => true
attr_accessor :id, :email, :subject, :name, :message
def initialize(attributes = {})
@ -23,4 +27,5 @@ class Contact
end
return false
end
end

View File

@ -7,7 +7,7 @@
</div>
<div class="sg-17 contact-form">
<%= form_for :contact, :url => { :action => 'create' } do |f| %>
<%= form_for :contact, :url => { :action => 'create' }, :html => { :id => 'contact_form' } do |f| %>
<% if flash[:notice] -%>
<div id="notice"><%= flash[:notice] %></div>
<% end -%>

View File

@ -6,7 +6,7 @@
<%= stylesheet_link_tag "squaregrid", :media => "all" %>
<%= stylesheet_link_tag "photos", :media => "all" %>
<%= stylesheet_link_tag "fancybox", :media => "all" %>
<%= javascript_include_tag 'jquery', 'jrails', 'fancybox', 'photos' %>
<%= javascript_include_tag 'jquery', 'jquery.validate', 'jrails', 'fancybox', 'photos' %>
</head>
<body>

10
lib/email_validator.rb Normal file
View File

@ -0,0 +1,10 @@
# lib/email_validator.rb
class EmailValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
object.errors[attribute] << (options[:message] || "is not valid")
end
end
end

Binary file not shown.

16
public/javascripts/jquery.validate.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -2,4 +2,24 @@ $(document).ready(function() {
$('.fancy').fancybox({
'titlePosition' : 'inside'
});
if ($('#contact_form').length) {
$('#contact_form').validate({
rules: {
'contact[name]': "required",
'contact[email]': {
required: true,
email: true
},
'contact[message]': "required",
},
messages: {
'contact[email]': {
email: "Invalid email address."
}
}
});
console.info('Validation set.');
}
});

Binary file not shown.

View File

@ -3,23 +3,23 @@ body {
color: white;
font-family: "Helvetica Neue", "Arial", "Helvatica", sans-serif;
font-size: 14px;
overflow: hidden;
overflow: hidden;
}
a {
text-decoration: none;
text-decoration: none;
}
p a {
display: inline !important;
color: #acf;
display: inline !important;
color: #acf;
}
p a:hover {
color: #fff;
color: #fff;
}
#page {
position: absolute;
top: 40%;
margin-top: -230px;
width: 100%;
position: absolute;
top: 40%;
margin-top: -230px;
width: 100%;
}
#container {
padding-top: 20px;
@ -33,12 +33,12 @@ p a:hover {
height: 308px;
}
#header a {
display: block;
height: 308px;
width: 308px;
display: block;
height: 308px;
width: 308px;
}
#header a:hover {
background: rgba(255,255,255,0.1);
background: rgba(255,255,255,0.1);
}
#header img {
padding: 0;
@ -48,215 +48,230 @@ p a:hover {
right: 20px;
}
#footer {
background: #333;
color: black;
text-align: right;
height: 28px;
background: #333;
color: black;
text-align: right;
height: 28px;
}
#footer p {
margin: 0 10px;
margin: 0 10px;
}
.sg-5, .sg-7, .sg-11, .sg-17, .sg-35 {
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
}
.sg-5 a, .sg-7 a, .sg-11 a, .sg-17 a, .sg-35 {
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
}
.sg-5 {
height: 140px;
}
.sg-5 a {
position: relative;
display: block;
color: white;
height: 140px;
width: 140px;
position: relative;
display: block;
color: white;
height: 140px;
width: 140px;
}
.sg-7 {
height: 196px;
height: 196px;
}
.sg-7 a {
position: relative;
display: block;
color: white;
height: 196px;
width: 196px;
position: relative;
display: block;
color: white;
height: 196px;
width: 196px;
}
.sg-11 {
height: 308px;
height: 308px;
}
.sg-11 a {
display: block;
height: 308px;
width: 308px;
display: block;
height: 308px;
width: 308px;
}
.sg-17 {
height: 476px;
height: 476px;
}
.sg-17 a {
display: block;
width: 476px;
height: 476px;
display: block;
width: 476px;
height: 476px;
}
.about {
background-color: #99BF00;
background-color: #99BF00;
}
.portfolio {
background-color: #C03232;
background-color: #C03232;
}
.contact {
background-color: #777;
background-color: #777;
}
.about a:focus, .portfolio a:focus, .contact a:focus {
background: rgba(255,255,255,0.1);
background: rgba(255,255,255,0.1);
}
.about a:hover, .portfolio a:hover, .contact a:hover {
background: rgba(255,255,255,0.2);
background: rgba(255,255,255,0.2);
}
.about a span, .portfolio a span, .contact a span {
position: absolute;
top: 10px;
right: 20px;
position: absolute;
top: 10px;
right: 20px;
}
.category {
position: relative;
}
.category a, .photo a {
display: block;
display: block;
color: white;
text-decoration: none;
}
.category a .arrow {
position: absolute;
font-size: 2em;
bottom: 20px;
position: absolute;
font-size: 2em;
bottom: 20px;
left: 20px;
}
.category a:focus, .photo a:focus {
background: rgba(255,255,255,0.1);
background: rgba(255,255,255,0.1);
}
.category a:hover, .photo a:hover {
background: rgba(255,255,255,0.2);
background: rgba(255,255,255,0.2);
}
.blank-category, .blank-photo {
background: #222;
outline: 1px dashed #444;
}
.category h3 {
position: absolute;
top: 16px;
right: 0;
text-align: right;
margin: 0 20px;
position: absolute;
top: 16px;
right: 0;
text-align: right;
margin: 0 20px;
font-weight: normal;
font-size: 1.1em;
line-height: 1em;
line-height: 1em;
}
img {
}
.page-links {
background: #666;
background: #666;
}
.prev-link, .next-link {
color: white;
font-size: 2em;
position: relative;
display: block;
color: white;
font-size: 2em;
position: relative;
display: block;
}
.prev-link div, .next-link div {
position: absolute;
bottom: 15px;
position: absolute;
bottom: 15px;
}
.prev-link div {
left: 20px;
left: 20px;
}
.next-link div {
right: 20px;
right: 20px;
}
.prev-link:hover, .next-link:hover {
background: rgba(255,255,255,0.2);
background: rgba(255,255,255,0.2);
}
.about-content {
background: #444;
color: #ccc;
background: #444;
color: #ccc;
}
.about-content div {
padding: 15px 20px;
padding: 15px 20px;
}
.about-content div p {
margin-bottom: 0.6em;
line-height: 1.4em;
margin-bottom: 0.6em;
line-height: 1.4em;
}
/* FORM */
.contact-form {
background: #ddd;
background: #ddd;
}
.field_with_errors {
display: inline;
display: inline;
}
form {
padding: 10px 20px;
padding: 10px 25px;
}
form p {
margin: 10px 0;
margin: 10px 0;
}
form p {
color: #555;
color: #555;
}
form label {
color: #666;
display: block;
width: 100px;
float: left;
color: #666;
display: block;
width: 75px;
float: left;
}
form label.error {
float: none;
display: inline;
color: #990000;
margin-left: 10px;
}
form textarea {
height: 150px;
width: 315px;
height: 150px;
width: 335px;
}
form textarea, form input[type='text'] {
font-family:"Helvetica Neue","Arial","Helvatica",sans-serif;
font-size:14px;
padding: 3px;
color: #333;
border: 2px solid #999;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
font-family:"Helvetica Neue","Arial","Helvatica",sans-serif;
font-size:14px;
padding: 3px;
color: #333;
border: 2px solid #999;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
form input#contact_name {
width: 175px;
}
form input#contact_email {
width: 175px;
}
form input#contact_subject {
width: 335px;
}
#alert {
background: #fffeef;
color: #664400;
border-width: 2px 0;
border-style: solid;
border-color: #996600;
padding: 0 10px 2px;
margin-top: 15px;
background: #fffeef;
color: #664400;
border-width: 2px 0;
border-style: solid;
border-color: #996600;
padding: 0 10px 2px;
margin-top: 15px;
}
#notice {
background: #efffef;
color: #446600;
border-width: 2px 0;
border-style: solid;
border-color: #669900;
padding: 0 10px 2px;
margin-top: 15px;
background: #efffef;
color: #446600;
border-width: 2px 0;
border-style: solid;
border-color: #669900;
padding: 0 10px 2px;
margin-top: 15px;
}
.field_with_errors input, .field_with_errors textarea {
background: #ffefef;
border-color: #cc3333 !important;
.field_with_errors input, .field_with_errors textarea, input.error, textarea.error {
background: #ffefef;
border-color: #cc3333 !important;
}
form input[type='submit'] {
background: #666;
font-family:"Helvetica Neue","Arial","Helvatica",sans-serif;
font-size:14px;
padding: 3px;
color: white;
border: 2px solid #333;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
background: #666;
font-family:"Helvetica Neue","Arial","Helvatica",sans-serif;
font-size:14px;
padding: 3px;
color: white;
border: 2px solid #333;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
}