Skip to content

Commit

Permalink
Add membership inquiry form
Browse files Browse the repository at this point in the history
  • Loading branch information
danielfone committed Aug 16, 2016
1 parent 859491f commit ddcaae5
Show file tree
Hide file tree
Showing 14 changed files with 296 additions and 18 deletions.
11 changes: 4 additions & 7 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
gem 'pg', '~> 0.18'
# Use Puma as the app server
gem 'puma', '~> 3.0'

gem 'responders'
gem 'simple_form'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
Expand All @@ -18,13 +22,6 @@ gem 'coffee-rails', '~> 4.2'

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
Expand Down
12 changes: 7 additions & 5 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ GEM
globalid (0.3.7)
activesupport (>= 4.1.0)
i18n (0.7.0)
jbuilder (2.6.0)
activesupport (>= 3.0.0, < 5.1)
multi_json (~> 1.2)
jquery-rails (4.1.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
Expand All @@ -77,7 +74,6 @@ GEM
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
minitest (5.9.0)
multi_json (1.12.1)
nio4r (1.2.1)
nokogiri (1.6.8)
mini_portile2 (~> 2.1.0)
Expand Down Expand Up @@ -121,13 +117,18 @@ GEM
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
ffi (>= 0.5.0)
responders (2.2.0)
railties (>= 4.2.0, < 5.1)
sass (3.4.22)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
simple_form (3.2.1)
actionpack (> 4, < 5.1)
activemodel (> 4, < 5.1)
slop (3.6.0)
spring (1.7.2)
spring-watcher-listen (2.0.0)
Expand Down Expand Up @@ -162,14 +163,15 @@ PLATFORMS
DEPENDENCIES
byebug
coffee-rails (~> 4.2)
jbuilder (~> 2.5)
jquery-rails
listen (~> 3.0.5)
pg (~> 0.18)
pry-rails
puma (~> 3.0)
rails (~> 5.0.0, >= 5.0.0.1)
responders
sass-rails (~> 5.0)
simple_form
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data
Expand Down
1 change: 1 addition & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
responders :flash
end
18 changes: 18 additions & 0 deletions app/controllers/membership_inquiries_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class MembershipInquiriesController < ApplicationController

respond_to :html

def create
@inquiry = MembershipInquiry.new(inquiry_params)
@inquiry.deliver_email
respond_with @inquiry, location: root_path
end

private

def inquiry_params
params.require(:membership_inquiry).permit(:email)
end


end
23 changes: 23 additions & 0 deletions app/forms/membership_inquiry.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class MembershipInquiry
include ActiveModel::Model

attr_accessor :email

validates_presence_of :email
validate :must_be_valid_email

def deliver_email
return unless valid?

end

private

def must_be_valid_email
errors.add(:email, :cannot_be_found) unless member.present?
end

def member
@member ||= Member.find_by email: email
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,4 @@
and other society matters at the AGM held at Rails Camp each year.
</p>

<p>
<em>
If you have an questions, feedback, or problems
please email <a href="mailto:[email protected]">[email protected]</a>.
</em>
</p>
<%= render 'membership_inquiries/form', inquiry: MembershipInquiry.new %>
4 changes: 4 additions & 0 deletions app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
Official Membership Register
<small>Ruby New Zealand Incorporated</small>
</h1>

<div class="flash">
<%= flash[:notice] %>
</div>
<%= yield %>
</body>
</html>
15 changes: 15 additions & 0 deletions app/views/membership_inquiries/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<p>
You can check your membership and update your details with the email address
you used for membership.
<%= simple_form_for(inquiry) do |f| %>
<%= f.input :email, placeholder: 'Email Address', label: false %>
<%= f.button :submit, 'Submit Inquiry' %>
<% end %>
</p>

<p>
<em>
If you have an questions, feedback, or problems
please email <a href="mailto:[email protected]">[email protected]</a>.
</em>
</p>
3 changes: 3 additions & 0 deletions app/views/membership_inquiries/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<h2>Membership Inquiry</h2>

<%= render 'membership_inquiries/form', inquiry: @inquiry %>
165 changes: 165 additions & 0 deletions config/initializers/simple_form.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# Use this setup block to configure all options available in SimpleForm.
SimpleForm.setup do |config|
# Wrappers are used by the form builder to generate a
# complete input. You can remove any component from the
# wrapper, change the order or even add your own to the
# stack. The options given below are used to wrap the
# whole input.
config.wrappers :default, class: :input,
hint_class: :field_with_hint, error_class: :field_with_errors do |b|
## Extensions enabled by default
# Any of these extensions can be disabled for a
# given input by passing: `f.input EXTENSION_NAME => false`.
# You can make any of these extensions optional by
# renaming `b.use` to `b.optional`.

# Determines whether to use HTML5 (:email, :url, ...)
# and required attributes
b.use :html5

# Calculates placeholders automatically from I18n
# You can also pass a string as f.input placeholder: "Placeholder"
b.use :placeholder

## Optional extensions
# They are disabled unless you pass `f.input EXTENSION_NAME => true`
# to the input. If so, they will retrieve the values from the model
# if any exists. If you want to enable any of those
# extensions by default, you can change `b.optional` to `b.use`.

# Calculates maxlength from length validations for string inputs
b.optional :maxlength

# Calculates pattern from format validations for string inputs
b.optional :pattern

# Calculates min and max from length validations for numeric inputs
b.optional :min_max

# Calculates readonly automatically from readonly attributes
b.optional :readonly

## Inputs
b.use :label_input
b.use :hint, wrap_with: { tag: :span, class: :hint }
b.use :error, wrap_with: { tag: :span, class: :error }

## full_messages_for
# If you want to display the full error message for the attribute, you can
# use the component :full_error, like:
#
# b.use :full_error, wrap_with: { tag: :span, class: :error }
end

# The default wrapper to be used by the FormBuilder.
config.default_wrapper = :default

# Define the way to render check boxes / radio buttons with labels.
# Defaults to :nested for bootstrap config.
# inline: input + label
# nested: label > input
config.boolean_style = :nested

# Default class for buttons
config.button_class = 'btn'

# Method used to tidy up errors. Specify any Rails Array method.
# :first lists the first message for each field.
# Use :to_sentence to list all errors for each field.
# config.error_method = :first

# Default tag used for error notification helper.
config.error_notification_tag = :div

# CSS class to add for error notification helper.
config.error_notification_class = 'error_notification'

# ID to add for error notification helper.
# config.error_notification_id = nil

# Series of attempts to detect a default label method for collection.
# config.collection_label_methods = [ :to_label, :name, :title, :to_s ]

# Series of attempts to detect a default value method for collection.
# config.collection_value_methods = [ :id, :to_s ]

# You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
# config.collection_wrapper_tag = nil

# You can define the class to use on all collection wrappers. Defaulting to none.
# config.collection_wrapper_class = nil

# You can wrap each item in a collection of radio/check boxes with a tag,
# defaulting to :span.
# config.item_wrapper_tag = :span

# You can define a class to use in all item wrappers. Defaulting to none.
# config.item_wrapper_class = nil

# How the label text should be generated altogether with the required text.
# config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }

# You can define the class to use on all labels. Default is nil.
# config.label_class = nil

# You can define the default class to be used on forms. Can be overriden
# with `html: { :class }`. Defaulting to none.
# config.default_form_class = nil

# You can define which elements should obtain additional classes
# config.generate_additional_classes_for = [:wrapper, :label, :input]

# Whether attributes are required by default (or not). Default is true.
# config.required_by_default = true

# Tell browsers whether to use the native HTML5 validations (novalidate form option).
# These validations are enabled in SimpleForm's internal config but disabled by default
# in this configuration, which is recommended due to some quirks from different browsers.
# To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,
# change this configuration to true.
config.browser_validations = false

# Collection of methods to detect if a file type was given.
# config.file_methods = [ :mounted_as, :file?, :public_filename ]

# Custom mappings for input types. This should be a hash containing a regexp
# to match as key, and the input type that will be used when the field name
# matches the regexp as value.
# config.input_mappings = { /count/ => :integer }

# Custom wrappers for input types. This should be a hash containing an input
# type as key and the wrapper that will be used for all inputs with specified type.
# config.wrapper_mappings = { string: :prepend }

# Namespaces where SimpleForm should look for custom input classes that
# override default inputs.
# config.custom_inputs_namespaces << "CustomInputs"

# Default priority for time_zone inputs.
# config.time_zone_priority = nil

# Default priority for country inputs.
# config.country_priority = nil

# When false, do not use translations for labels.
# config.translate_labels = true

# Automatically discover new inputs in Rails' autoload path.
# config.inputs_discovery = true

# Cache SimpleForm inputs discovery
# config.cache_discovery = !Rails.env.development?

# Default class for inputs
# config.input_class = nil

# Define the default class of the input wrapper of the boolean input.
config.boolean_label_class = 'checkbox'

# Defines if the default input wrapper class should be included in radio
# collection wrappers.
# config.include_default_input_wrapper_class = true

# Defines which i18n scope will be used in Simple Form.
# config.i18n_scope = 'simple_form'
end
10 changes: 10 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,13 @@

en:
hello: "Hello world"
errors:
attributes:
email:
cannot_be_found: "couldn't be found in our membership register"

flash:
membership_inquiries:
create:
notice: "Delivered email with membership details"

31 changes: 31 additions & 0 deletions config/locales/simple_form.en.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
en:
simple_form:
"yes": 'Yes'
"no": 'No'
required:
text: 'required'
mark: '*'
# You can uncomment the line below if you need to overwrite the whole required html.
# When using html, text and mark won't be used.
# html: '<abbr title="required">*</abbr>'
error_notification:
default_message: "Please review the problems below:"
# Examples
# labels:
# defaults:
# password: 'Password'
# user:
# new:
# email: 'E-mail to sign in.'
# edit:
# email: 'E-mail.'
# hints:
# defaults:
# username: 'User name to sign in.'
# password: 'No special characters, please.'
# include_blanks:
# defaults:
# age: 'Rather not say'
# prompts:
# defaults:
# age: 'Select your age'
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
root to: 'application#home'

resources :members, except: :index
resources :membership_inquiries, only: [:new, :create]

namespace :admin do
resources :members
Expand Down
Loading

0 comments on commit ddcaae5

Please sign in to comment.