Ruby on Rails - undefined method 'ofertum_path' - ruby-on-rails

I have this model Oferta
class Oferta < ActiveRecord::Base
belongs_to :entidade
has_many :candidatos, :through => :interesses
has_many :interesses, foreign_key: "oferta_id", dependent: :destroy
validates :entidade_id, presence: true
validates :titulo, :presence => { :message => "Título tem de ser preenchido" }, length: { maximum: 40, message: "Título muito extenso! Máximo 40 caracteres!" }
validates :corpo, :presence => { :message => "Corpo tem de ser preenchido" }, length: { maximum: 150, message: "Corpo muito extenso! Máximo 150 caracteres!" }
validates :tipo, inclusion: { in: %w(full_time part_time), message: "%{value} não é válido" }
validates :salario, numericality: { only_integer: true }
i have resources :ofertas in the routes file.
And so far the routing is fine and it works. But in my view:
<% provide(:title,"Editar Oferta") %>
<h1>Editar Oferta</h1>
<div class="row">
<div class="span6 offset3">
<%= simple_form_for #oferta do |f| %>
<%= render 'shared/error_messages' %>
<%= f.input :titulo %>
<%= f.input :corpo %>
<%= f.input :data_inicio %>/<%= f.input :data_fim %>
<%= f.input :atividade %>
<%= f.select :tipo, ["full_time","part_time"], :label => "Tipo" %>
<%= f.input :salario %>
<%= f.select :ativa, ["true","false"], :label => "Atiar/Desativar" %>
<% end %>
</div>
</div>
I get a undefined method 'ofertum_path' in the simple_form_for tag.....
my controller so far is this:
class OfertasController < ApplicationController
def edit
#oferta = Oferta.find(params[:id])
end
I just dont get where the ofertum is coming from. Can someone help me?

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

Validate one form field or another form field based on a form selection, but not both at the same time

How do you validate only check when PAYMENT_TYPE check is selected and also validate only creditcard when PAYMENT_TYPE creditcard is selected?
class Order < ActiveRecord::Base
attr_accessible :check, :creditcard
PAYMENT_TYPES = [ "Check", "Credit card" ]
validates :creditcard, :presence => { :if => :creditcard? }
validates :check, :presence => { :if => :check? }
def creditcard?
check == nil
end
def creditcard?
creditcard == nil
end
end
form
<%= form_for(#order) do |f| %>
...
<div class="field">
<%= f.label :pay_type %><br />
<%= f.select :pay_type, Order::PAYMENT_TYPES,
prompt: 'Select a payment method' %>
</div>
<div id="creditcard">
<%= f.label :creditcard, class: "creditcard" %><br />
<%= f.text_field :creditcard, class: "creditcard" %>
</div>
<div id="check">
<%= f.label :check, class: "check" %><br />
<%= f.text_field :check, class: "check" %>
</div>
...
See below. Your checking should be on pay_type.
class Order < ActiveRecord::Base
attr_accessible :check, :creditcard, :pay_type
PAYMENT_TYPES = [ "Check", "Credit card" ]
validates :creditcard, :presence => true, :if => :creditcard_selected?
validates :check, :presence => true, :if => :check_selected?
def check_selected?
pay_type == "CHECK"
end
def creditcard_selected?
pay_type == "Credit Card"
end
end

Resources