Form accept terms is not validated - ruby-on-rails

I want to archive that the signup form give a validation error if the "accept terms" checkbox is not checked. for some reason the validation messages for all fields appear correctly but not for that checkbox.
users/new.html.erb:
<%= form_for(#user, url: signup_path) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.text_field :name, class: "login", placeholder: :name
...more fields...
<%= f.check_box :agreement, class: "field login-checkbox" %>
<label class="choice" for="Field"><%= t("agree_terms") %></label>
<%= f.submit t("register"), class: "button btn btn-primary btn-large" %>
<% end %>
models/user.rb:
class User < ActiveRecord::Base
validates :name, presence: true, length: { maximum: 50 }
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
# this is the validation
validates :agreement, acceptance: { accept: true }
...
end

Have a look here: http://guides.rubyonrails.org/active_record_validations.html#acceptance
validates :agreement, acceptance: true
should do the trick for you.

Related

Simple_form_for on Rails - how to show error validations after submit

I'm trying to only show errors in my form when the user clicks the submit button but currently, it is displaying all errors before the user clicks the submit button. How do I only show errors when the user submits the form?
I'm using simple-form in Rails
Here is my simple-form:
<div class="col-md-10 col-lg-8 col-xl-5 col-md-offset-4 mx-auto">
<%= simple_form_for #customer, url: customers_path, method: :post do |f| %>
<%= f.error_notification %>
<%= f.input :first_name %>
<%= f.input :last_name %>
<%= f.input :email, input_html: { autocomplete: 'email' } %>
<%= f.input :budget, collection: ["€200,000 - €299,999", "€300,000 - €399,999", "€400,000 - €499,999", "€500,000 - €649,999", "€650,000 - €799,999", "€800,000 - €1,000,000", "€1,000,000 +"] %>
<%= f.input :comments, :as => :text, :input_html => { 'rows' => 10, 'cols' => 10 } %>
<%= f.button :submit, "Submit", class: "btn-primary trigger mt-1" %>
<% end %>
</div>
Here are my customer validations in my customer model:
class Customer < ApplicationRecord
validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }, uniqueness: true
validates :first_name, presence: true, length: { minimum: 2 }
validates :last_name, presence: true, length: { minimum: 2 }
validates :budget, presence: true
validates :comments, presence: true
end
Thank you
you can change simple_form_for (line 2) like this below
<%= simple_form_for #customer, html: { novalidate: true }, url: customers_path, method: :post do |f| %>
explanation:
by adding , html: { novalidate: true } This option adds a new novalidate property to the form, instructing it to skip all HTML 5 validation.

Rails simple-form association not saving

Am new to RoR and Simple_form. I have a simple set-up where I have an association between 2 classes. The form I use is not updating/saving and always setting the value back to blank. Looked at the docs and other postings, what am I doing wrong?
Classes
class Annotation < ApplicationRecord
has_many :comments, dependent: :destroy
belongs_to :documenttype
has_attached_file :file, styles: { large: "600x600>", medium: "500x500>", thumb: "150x150#" }, default_url: "/images/:style/missing.png"
accepts_nested_attributes_for :documenttype
validates_attachment_content_type :file, content_type: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf']
validates :name, presence: true, uniqueness: true, length: { minimum: 10, maximum: 50 }
validates :description, length: { minimum: 20, maximum: 500 }
validates :documenttype, presence: true
validates :file, presence: true
end
class Documenttype < ApplicationRecord
has_many :annotations
validates :name, presence: true, uniqueness: true, length: { minimum: 5 }
end
Params
def annotation_params
params.require(:annotation).permit(:name, :description, :file, :active, :documenttype)
end
def documenttype_params
params.require(:documenttype).permit(:name, :description, :active, annotation_attributes: [:id, :name])
end
This is the form...
<div class="container-fluid">
<div class="row">
<div class="col-md-6">
<%= simple_form_for #annotation, html: { class: 'form-horizontal', multipart: true },
wrapper: :horizontal_form,
wrapper_mappings: {
check_boxes: :horizontal_radio_and_checkboxes,
radio_buttons: :horizontal_radio_and_checkboxes,
file: :horizontal_file_input,
boolean: :horizontal_boolean
} do |f| %>
<%= f.error_notification %>
<%= f.input :name, placeholder: 'Enter name' %>
<%= f.input :description, placeholder: 'Description' %>
<%= f.association :documenttype %>
<%= f.input :active, as: :boolean %>
<% if #annotation.file.blank? %>
<%= f.input :file, as: :file %>
<% else %>
<% end %>
<%= f.button :submit %>
<% unless #annotation.file.blank? %>
<%= link_to ' Annotate', annotations_path, :class => "btn btn-default" %>
<% end -%>
<% end %>
<p><br><%= link_to 'List' , annotations_path %></p>
</div>
<div class="col-md-6">
<% unless #annotation.file.blank? %>
<%= image_tag #annotation.file.url(:large) %>
<% end %>
</div>
</div>
I found the solution; I needed to add :documenttype_id to annotation_params.

Rails form_for Can not save database

I'm newbie and need help on reviewing my code.
The form data can't be saved and flash success message is not showing either.
this is what's showing up in rails server:
Started POST "/registrations" for 139.193.122.192 at 2016-01-18 02:02:07 +0000
Cannot render console from 139.193.122.192! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"rOZfP2y2huPWAZoUaYjlRXyos5aqiaJh3MTiidXZFRBHJW0yL/rSC4cZwyMuZ//UwwUounNMgzL8HL/yJI8RyQ==", "registration"=>{"name"=>"Yosafat", "last_name"=>"Kakomba", "date_of_birth"=>"06/08/1982", "address"=>"Perum Vila Nusa Indah 2 Blok CC2/18 Jatiasih", "suburb"=>"Bekasi", "post_code"=>"16969", "telephone"=>"622193709536", "email"=>"ariel.kakomba#gmail.com", "news_letter"=>"1", "private_health_fund"=>"0", "exercise_routine"=>"Never", "occupation"=>"Programmer", "past_medical_history"=>"I don't have", "medication"=>"I don't have", "symptoms"=>"I don't have", "terms_of_service"=>"1"}, "gift_voucher"=>"1", "other_references"=>{"{:placeholder=>\"Do you have any other references?\"}"=>""}, "gentle_treatment"=>"1", "head"=>"1", "allergies_or_asthma"=>"1", "commit"=>"Register Now"}
Unpermitted parameter: last_name (0.1ms) begin transaction Registration Exists (0.2ms) SELECT 1 AS one FROM "registrations" WHERE LOWER("registrations"."email") = LOWER('ariel.kakomba#gmail.com') LIMIT 1 (0.1ms) rollback transaction Redirected to https://simpleform3-yoskakomba.c9users.io/ Completed 302 Found in 192ms (ActiveRecord: 1.7ms)
Started GET "/" for 139.193.122.192 at 2016-01-18 02:02:07 +0000 Cannot render console from 139.193.122.192! Allowed networks:
127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by PagesController#index as HTML Rendered pages/index.html.erb within layouts/application (37.3ms) Rendered layouts/_navigation.html.erb (2.3ms) Rendered layouts/_messages.html.erb (0.1ms) Rendered layouts/_footer.html.erb (0.1ms) Completed 200 OK in 309ms (Views:
308.1ms | ActiveRecord: 0.0ms)
and when I checked in Rails Console:
The data is not saved, and flash success message is not showing up.
Here is my controller:
class RegistrationsController < ApplicationController
def new
#registration = Registration.new
end
def create
#registration = Registration.new(registration_params)
if #registration.save
flash[:success] = "Your registration was created succesfully"
redirect_to root_path
else
redirect_to root_path
end
end
private
def registration_params
params.require(:registration).permit(:name, :lastname, :date_of_birth,
:address, :suburb, :post_code, :telephone, :private_health_fund,
:email, :reference, :news_letter, :occupation, :exercise_routine, :body_conditions,
:past_medical_history, :medication, :symptoms, :other_experience, :preference,
:body_area, :terms_of_service, :drive_and_walk_by, :google_search, :gift_voucher, :yellow_pages, :yelp, :trip_advisor,:start_local,
:tenbest, :time_out, :friend_referral, :quiet, :treatment_description, :gentle_treatment, :face,
:hair_scalp, :head, :chest, :stomach, :back, :buttocks, :arms, :legs, :hands, :feet, :allergies_or_asthma, :open_wounds,
:numbness_tinglint,
:skin_condition, :headaches_migraine, :recent_illness_or_surgery, :varicose_veins, :diabetes, :osteoporosis)
end
end
the form is in index.html.erb and using ClientSideValidation gem to validate
<h2>Registration Form</h2> <hr>
<div class="row">
<div class="well col-md-8 col-md-offset-2">
<%= form_for #registration, validate:true do |f| %>
<div class="row"><!-- FIELD FOR NAME / LAST NAME / DOB -->
<div class="col-md-4">
<%= f.label :name %>
<%= f.text_field :name, placeholder: 'first name' %>
</div>
<div class="col-md-4">
<%= f.label :last_name %>
<%= f.text_field :last_name, placeholder: 'last name' %>
</div>
<div class="col-md-4">
<%= f.label :date_of_birth %>
<%= f.text_field :date_of_birth, placeholder: 'Your date of birth ex: DD/MM/YYYY' %>
</div>
</div>
<div class="row"><!-- FIELD FOR ADDRESS / SUBURB/ POSTCODE -->
<div class="col-md-4">
<%= f.label :address %>
<%= f.text_field :address, placeholder: 'Your primary home address' %>
</div>
<div class="col-md-4">
<%= f.label :suburb %>
<%= f.text_field :suburb, placeholder: 'Your sub urban area' %>
</div>
<div class="col-md-4">
<%= f.label :post_code %>
<%= f.text_field :post_code, placeholder: 'Address postal code' %>
</div>
</div>
<div class="row"><!-- FIELD FOR TELEPHONE AND EMAIL -->
<div class="col-md-6">
<%= f.label :telephone %>
<%= f.text_field :telephone, placeholder: 'Mobile or landline' %>
</div>
<div class="col-md-6">
<%= f.label :email %>
<%= f.email_field :email, placeholder: 'Your email address' %>
</div>
</div>
<div class="row checkbox"><!-- FIELD FOR PRIVATE HEALTH FUND & NEWSLETTER CHECKBOX -->
<div class="col-md-6">
<%= f.label :news_letter %>
<%= f.check_box :news_letter %>
<p>*Interested in receiving news or promotion from us?</p>
</div>
<div class="col-md-6">
<%= f.label :private_health_fund %>
<%= f.check_box :private_health_fund %>
<p>*Do you have private health fund?</p>
</div>
</div>
<div class="row"></div>
<div class="row checkbox"><!-- FIELD FOR REFERENCES AND PREFERENCE -->
<div class="col-md-6">
<b>How Did You Hear About Us?</b><br/><br/ >
<%= check_box_tag :drive_and_walk_by %> <h8>Drive and Walk by</h8> <br/>
<%= check_box_tag :google_search %> <h8>Google Search</h8> <br/>
<%= check_box_tag :gift_voucher %> <h8>Gift voucher</h8> <br/>
<%= check_box_tag :yellow_pages %> <h8>Google Search</h8> <br/>
<%= check_box_tag :yelp %> <h8>Yelp</h8> <br/>
<%= check_box_tag :trip_advisor %> <h8>Trip Advisor</h8> <br/>
<%= check_box_tag :start_local %> <h8>Start Local</h8> <br/>
<%= check_box_tag :tenbest %> <h8>10Best</h8> <br/>
<%= check_box_tag :time_out %> <h8>Time Out</h8> <br/>
<%= check_box_tag :friend_referral %> <h8>Friend referral</h8> <br/><br/>
<b>Other References</b><br/>
<%= text_field :other_references, placeholder: 'Do you have any other references?'%>
</div>
<div class="col-md-6">
<b>Your Preference in Massage Therapy</b><br/><br/ >
<%= check_box_tag :quiet %> <h8>Quiet environment</h8> <br/>
<%= check_box_tag :treatment_description %> <h8>Treatment Description</h8> <br/>
<%= check_box_tag :gentle_treatment %> <h8>Gentle Treatment</h8> <br/><br/>
<b>Excercise Routine</b><br/>
<%= f.select :exercise_routine, ['Never', 'Light 1-2 times', 'Moderate 3-4 times', 'Competitive 5-7 times'], validate: false, prompt: 'How many times do you excercise?' %>
</div>
</div>
<div class="row checkbox">
<div class="col-md-6">
<b>Body area you want to skip</b><br/><br/ >
<%= check_box_tag :face %> <h8>Face</h8> <br/>
<%= check_box_tag :hair_scalp %> <h8>Hair Scalp</h8> <br/>
<%= check_box_tag :head %> <h8>Head</h8> <br/>
<%= check_box_tag :chest %> <h8>Chest</h8> <br/>
<%= check_box_tag :stomach %> <h8>Stomach</h8> <br/>
<%= check_box_tag :back %> <h8>Back</h8> <br/>
<%= check_box_tag :buttocks %> <h8>Buttocks</h8> <br/>
<%= check_box_tag :arms %> <h8>Arms</h8> <br/>
<%= check_box_tag :legs %> <h8>Legs</h8> <br/>
<%= check_box_tag :hands %> <h8>Hands</h8><br/>
<%= check_box_tag :feet %> <h8>Feet</h8><br/>
</div>
<div class="col-md-6">
<b>Existing Health Condition</b><br/><br/ >
<%= check_box_tag :allergies_or_asthma %> <h8>Allergies or Asthma</h8> <br/>
<%= check_box_tag :open_wounds %> <h8>Open Wounds</h8> <br/>
<%= check_box_tag :numbness_tinglint %> <h8>Numbness/Tinglint</h8> <br/>
<%= check_box_tag :skin_condition %> <h8>Skin Condition</h8> <br/>
<%= check_box_tag :headaches_migraine %> <h8>Headaches/Migraine</h8> <br/>
<%= check_box_tag :recent_illness_or_surgery %> <h8>Recent Illness or Surgery</h8> <br/>
<%= check_box_tag :varicose_veins %> <h8>Varicose Veins</h8> <br/>
<%= check_box_tag :diabetes %> <h8>Diabetes</h8> <br/>
<%= check_box_tag :osteoporosis %> <h8>Osteoporosis</h8> <br/><br/>
</div>
</div><br/>
<div class="row"><!-- FIELD FOR OCCUPATION AND PAST MEDICAL HISTORY -->
<div class="col-md-6">
<%= f.label :occupation %>
<%= f.text_area :occupation, placeholder: "Your main job", validate: false %>
</div>
<div class="col-md-6">
<%= f.label :past_medical_history %>
<%= f.text_area :past_medical_history, placeholder: "Please tell us if you have medication history within 5 years before we proceed your therapy",
validate: false %>
</div>
</div>
<div class="row"><!-- FIELD FOR MEDICATION AND SYMPTOMS -->
<div class="col-md-6">
<%= f.label :medication %>
<%= f.text_area :medication, placeholder: "Please tell us if you have medication history within 5 years before we proceed your therapy",
validate: false %>
</div>
<div class="col-md-6">
<%= f.label :symptoms %>
<%= f.text_area :symptoms, placeholder: "Please tell us if you have any symptoms regarding your existing health condition before we proceed your therapy", validate: false %>
</div>
</div>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<b>Terms Of Service</b><br/>
<h7>Arrival Time</h7>
<p>Please arrive at least 10 minutes before your treatment. New clients will be asked to fill out a record form.</p>
<h7>Arrival Late</h7>
<p>All treatments conclude at the scheduled time.</p>
<h7>Cancelation Policy<h7>
<p>When you reschedule or cancel an appointment, we require 24 hours notice; cancellation without notice will incur a cancellation fee of $30.
Confirmation of an appointment is acknowledgement of this cancellation policy.</p>
</div>
</div>
<div class="row">
<div class="col-md-6 col-md-offset-3 checkbox">
<%= f.label "I agree with the terms of service" %>
<%= f.check_box :terms_of_service %><br/>
<p>*I read and understood the terms of service</p>
</div>
</div>
<%= f.submit 'Register Now', class: "btn btn-success" %>
<% end %>
</div><!-- FIELD FOR CLASS WELL -->
**This is my *application.html.erb***
<!DOCTYPE html>
<html>
<head>
<title>Workspace</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<%= render 'layouts/navigation' %>
<div class="container">
<%= render 'layouts/messages' %>
<%= yield %>
<%= render 'layouts/footer' %>
</div>
</body>
</html>
This is my registration.rb
class Registration < ActiveRecord::Base validates :name, presence: true, length: { minimum: 5, maximum: 19 } validates :last_name, presence: true, length: { minimum: 5, maximum: 19 } validates :address, presence: true validates :date_of_birth, presence: true VALID_EMAIL_REGEX = /\A([\w+\-].?)+#[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 105 },
uniqueness: { case_sensitive: false },
format: { with: VALID_EMAIL_REGEX } validates :suburb, presence: true validates :state, presence: true validates :post_code, presence: true validates :telephone, presence: true validates :reference, presence: true validates :news_letter, presence: true validates :occupation, presence: true validates :exercise_routine, presence: true validates :body_conditions, presence: true validates :past_medical_history, presence: true, length: { minimum: 5, maximum: 500 } validates :medication, presence: true, length: { minimum: 5, maximum: 500 } validates :symptoms, presence: true, length: { minimum: 5, maximum: 500 } validates :other_experience, presence: true, length: { minimum: 5, maximum: 500 } validates :preference, presence: true validates :body_area, presence: true validates :terms_of_service, presence: true end
Thank you so much for your help
When you look into the log that you posted, you can see there is an Unpermitted parameter: last_name. This is because in the form you have last_name and in the registration_params method you have lastname.
Changing lastname to last_name in registration_params should solve your problem.
Since you're new, I have some suggestions (#Pavan's answer is correct).
The reason you've got the problem is because you're requiring :last_name to be present with a validation:
#app/models/registration.rb
class Registration < ActiveRecord::Base
validates :name, presence: true, length: { minimum: 5, maximum: 19 }
validates :last_name, presence: true, length: { minimum: 5, maximum: 19 }
validates :address, presence: true
validates :date_of_birth, presence: true VALID_EMAIL_REGEX = /\A([\w+\-].?)+#[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 105 }, uniqueness: { case_sensitive: false }, format: { with: VALID_EMAIL_REGEX }
validates :suburb, presence: true
validates :state, presence: true
validates :post_code, presence: true
validates :telephone, presence: true
validates :reference, presence: true
validates :news_letter, presence: true
validates :occupation, presence: true
validates :exercise_routine, presence: true
validates :body_conditions, presence: true
validates :past_medical_history, presence: true, length: { minimum: 5, maximum: 500 }
validates :medication, presence: true, length: { minimum: 5, maximum: 500 }
validates :symptoms, presence: true, length: { minimum: 5, maximum: 500 }
validates :other_experience, presence: true, length: { minimum: 5, maximum: 500 }
validates :preference, presence: true
validates :body_area, presence: true
validates :terms_of_service, presence: true
end
Although this is great, it means that if you don't pass that parameter, Rails will come back with an error. Errors are stored in the errors method attached to your returned object:
#app/views/registrations/new.html.erb
<%= form_for #registration do |f| %>
<% if #registration.errors.any? %>
<% #registration.errors.full_messsages do |message| %>
<%= message %>
<% end %>
<% end %>
<% end %>
This will return the error messages from your model.
#app/controllers/registrations_controller.rb
class RegistrationsController < ApplicationController
def create
#registration = Registration.new(registration_params)
redirect_to root_path, success: "Your registration was created" if #registration.save
# will render "new" if errors
end
end
Secondly, you can clean up your model massively by declaring multiple validations (if they're the same):
#app/models/registration.rb
class Registration < ActiveRecord::Base
VALID_EMAIL_REGEX = /\A([\w+\-].?)+#[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
validates :name, :last_name, presence: true, length: { minimum: 5, maximum: 19 }
validates :email, presence: true, length: { maximum: 105 }, uniqueness: { case_sensitive: false }, format: { with: VALID_EMAIL_REGEX }
validates :past_medical_history, :medication, :symptoms, :other_experience, presence: true, length: { minimum: 5, maximum: 500 }
validates :date_of_birth, :address, :suburb, :state, :post_code, :telephone, :reference, :news_letter, :occupation, :exercise_routine, :body_conditions, :preference, :body_area, :terms_of_service, presence: true
end
Thirdly, your model needs to be called by the object name it reflects.
Ruby is an object orientated language, which means that everything you do with the system should be scoped around objects.
As a beginner, this won't matter; as you progress, you'll realize the importance of having...
#user = User.find x
#user.do_some_action
... thus, when you have Registration, if that's the nature of the data you're storing, it's great. If it isn't, you'll be best suited changing its name to something like User or Applicant etc.
Lastly, you need to cut down on all the data you're storing in one model.
You can split your model into about 2 others:
#app/models/registration.rb
class Registration < ActiveRecord::Base
has_one :address
has_one :preference
accepts_nested_attributes_for :address, :preference
end
#app/models/address.rb
class Address < ActiveRecord::Base
belongs_to :registration
end
#app/models/preference.rb
class Preference < ActiveRecord::Base
belongs_to :registration
end
This will allow you to pass multiple sets of data, rather than keeping it all in the same model:
#app/controllers/registrations_controller.rb
class RegistrationsController < ApplicationController
def new
#registration = Registration.new
#registration.build_address
#registration.build_preference
end
end
#app/views/registrations/new.html.erb
<%= form_for #registration do |f| %>
<%= f.fields_for :address do |a| %>
<%= a.text_field :address %>
<% end %>
<% end %>
You can read up more about accepts_nested_attributes_for here.
not sure if you have missed some of your form code but there needs to be
<%= f.submit "Submit" %>
<% end %>
..also, your flash messages are working in the background but you need to create a place for them to show up. Go to your application.html.erb in your layouts folder and after the opening body tag add:
<% flash.each do |key, value| %>
<%= content_tag :div, value, class: "#{key}" %>
<% end %>

Rails 4 validates_confirmation_of not firing

I know I must be missing something simple. I have a model that contains a validate_confirmation_of. I know it works in my model (I've tested it using the console) but for some reason, it seems the confirmation field on the form isn't linking into my model correctly and so the model thinks the confirmation field is blank and thus skips the validate.
Model
class Person < ActiveRecord::Base
enum status: { suspended: 0, pending_validation: 1, pending_setup: 2, registered: 3, unknown: 99 }
EMAIL_REGEX = /\A[a-z0-9._%+-]+#[a-z0-9.-]+\.[a-z]{2,4}\Z/i
validates :first_name, :presence => true, :length => { :maximum => 255 }
validates :last_name, :presence => true, :length => { :maximum => 255 }
validates :email_address, :presence => true, :length => { :maximum => 255 }, :uniqueness => true, :format => { :with => EMAIL_REGEX }, :confirmation => true
validates :country_code, :presence => true
end
View
<%= form_for #person, url: { action: 'create' } do |f| %>
<fieldset class="registration">
<legend>Your Information</legend>
<div class="group column-1">
<%= label_tag('First Name') %> <span class="required">*</span>
<%= f.text_field :first_name, class: 'form-control', :tabindex => 1 %>
<%= label_tag('Display Name') %>
<%= f.text_field :display_name, class: 'form-control', :tabindex => 3 %>
</div>
<div class="group column-2">
<%= label_tag('Last Name') %><span class="required">*</span>
<%= f.text_field :last_name, class: 'form-control', :tabindex => 2 %>
<%= label_tag('Country') %> <span class="required">*</span>
<%= f.collection_select :country_code, Country.order(:name), :iso_code, :name, { :include_blank => true }, { :class => 'form-control', :tabindex => 4 } %>
</div>
<div class="column-full">
<%= label_tag('Email Address') %> <span class="required">*</span>
<%= f.text_field :email_address, class: 'form-control', :tabindex => 5 %>
<%= label_tag('Confirm Email Address') %> <span class="required">*</span>
<%= f.text_field :email_address_confirmation, class: 'form-control', :tabindex => 6 %>
</div>
<div class="checkbox">
<label>
<%= check_box_tag 'chkTerms' %>
I accept the <%= link_to 'Terms & Conditions', '/pages/terms' %> <span class="required">*</span>
</label>
</div>
<div class="button-options">
<%= f.submit 'Submit', class: 'btn btn-danger' %>
<%= link_to 'Cancel', '/pages/home', class: 'link-button-cancel' %>
</div>
</fieldset>
<% end %>
Controller
def create
#person = Person.new(register_params)
#person.status = 'pending_validation'
if #person.save
render('submit')
else
render('register')
end
end
private
def register_params
params.require(:person).permit(:first_name, :last_name, :email_address, :display_name, :country_code)
end
As you can see, in my view I have a "email_address_confirmation" text_field. I created it the way I created all the other fields and they all work fine so for the life of me I can't figure out what is wrong with the code. But when I submit the page, no matter what I put in the confirmation field, the confirmation validate never fires.
In case it matters, I'm using Rails 4.2.0 and Ruby 2.1.5p273.
You need to add this in your model:
validates :email_address_confirmation, presence: true
According to Rails guides:
This (confirmation) check is performed only if email_confirmation is not nil.
Also make changes in your controller's method register_params, you miss email_address_confirmation field in permit parameters:
def register_params
params.require(:person).permit(:first_name, :last_name, :email_address, :email_address_confirmation, :display_name, :country_code)
end

How do I filter posts with Ruby-on-Rails

I have a job listing project set up and I want to be able to filter by several filters. I want to be able to have sidebar which can filter by certain elements - :city, :jobtype, and :contracttype
Is there a straightforward way to create radio buttons that will display the options available to the user i.e for :city a list of London, Manchester, Brighton etc which can be ticked to display those specific jobs?
I'm new to rails so having a hard time working out what I need to do, if anyone could explain what I need to do I'd really appreciate it!
My code is as follows:
index.html.erb -
<% #jobs.each do |job| %>
<div class="job">
<h2><%= job.position %></h2>
<p>Company: <%= job.company %></p>
<p>Salary: <%= job.salary %></p>
<p>Website: <%= job.companywebsite %></p>
<p>Twitter: <%= job.companytwitter %></p>
<p>Contract Type: <%= job.contract %></p>
<p>City: <%= job.city %></p>
<p>Expiry date: <%= job.expirydate %></p>
<p>Job Type: <%= job.jobtype %></p>
<p>Full Description:<br><br><%= job.description %></p>
<p>How to apply: <%= job.apply %></p>
</div>
<% end %>
job.rb -
class Job < ActiveRecord::Base
validates :position, presence: true
validates :company, presence: true
validates :salary, presence: true
validates :companywebsite, presence: true
validates :companytwitter, presence: true
validates :contract, presence: true
validates :city, presence: true
validates :expirydate, presence: true
validates :jobtype, presence: true
validates :description, presence: true
validates :apply, presence: true
end
jobs_controller.erb -
class JobsController < ApplicationController
def index
#jobs = Job.page(params[:page]).per(25)
end
def new
#job = Job.new
end
def create
#job = Job.new(params.require(:job).permit(:position, :company, :salary, :companywebsite, :companytwitter, :contract, :city, :expirydate, :jobtype, :description, :apply ))
if #job.save
redirect_to root_path
else
render "new"
end
end
end
new.html.erb -
<%= simple_form_for #job, html: { multipart: true } do |form| %>
<%= form.input :position, input_html: { maxlength: 60 }, placeholder: "Job Position", label: false %>
<%= form.input :company, input_html: { maxlength: 60 }, placeholder: "Company name", label: false %>
<%= form.input :salary, input_html: { maxlength: 60 }, placeholder: "Salary", label: false %>
<%= form.input :companywebsite, input_html: { maxlength: 60 }, placeholder: "Company Website", label: false %>
<%= form.input :companytwitter, input_html: { maxlength: 60 }, placeholder: "Twitter Handle e.g #Hatch_Inc", label: false %>
<%= form.input :contract, input_html: { maxlength: 60 }, placeholder: "Contract Type", label: false %>
<%= form.input :city, input_html: { maxlength: 60 }, placeholder: "City", label: false %>
<%= form.input :expirydate, input_html: { maxlength: 60 }, placeholder: "Expiry date", label: false %>
<%= form.input :jobtype, input_html: { maxlength: 60 }, placeholder: "Job Type", label: false %>
<%= form.input :description, input_html: { maxlength: 60 }, placeholder: "Full job description", label: false %>
<%= form.input :apply, input_html: { maxlength: 60 }, placeholder: "How to apply", label: false %>
<%= form.button :submit %>
<% end %>
Here's an example that uses JQuery to submit an AJAX request (so your page doesn't refresh every time a box is checked). In your view, you create a checkbox for each unique country. Jquery parameterizes the selected countries and submits them to your controller (specifying that you want to respond with JavaScript). A scope in your Jobs model applies the filter.
index.html.erb
<div id='job-list'>
<% #jobs.each do |job| %>
<div class="job">
<!-- Display your job here -->
</div>
<% end %>
</div>
<div id='countries'>
<h4> Country Filter: </h4>
<% #countries= Job.uniq.pluck(:country) %>
<% #countries.each do |c| %>
<br><input id="<%= c %>" type="checkbox" class="country-select" checked><label for="<%= c %>"> <%= c %> </label>
<% end %>
</div>
index.js.erb
var jobs = $('#job-list');
jobs.empty();
<% #jobs.each do |job|%>
jobs.append("<div class='job'><%= job %></div>"); // job display goes here
<% end %>
courses.coffee
getParams = ->
params = ""
countries = []
$(".country-select:checked").each ->
countries.push($(this).attr('id'))
params += "&#{$.param({countries: countries})}";
return params
$('.country-select').on 'change', (event) =>
$.ajax "/jobs.js?"+getParams(),
type: 'GET'
dataType: 'script'
Jobs controller
class JobsController < ApplicationController
respond_to :html, :js
def index
#jobs = Job.page(params[:page]).per(25).by_country(params[:countries])
end
end
Job model
class Job < ActiveRecord::Base
scope :by_country, -> (countries) { where(:country => (countries|| Course.uniq.pluck(:country)) ) }
end

Resources