How to change change error messages on rails - ruby-on-rails

My view:
<div class="form-group">
<% if #product.errors.details[:amount].any? %>
<div class="has-error">
<%= f.label "#{t('product.shineer_irsen')}", class: 'control-label' %>
<%= f.number_field :amount, value: 0, min: 0, class: "form-control" %>
</div>
<% else %>
<%= f.label "#{t('product.shineer_irsen')}", class: 'control-label' %>
<%= f.number_field :amount, value: 0, min: 0, class: "form-control" %>
<% end %>
</div>
I want to validate amount in input field and i want to change its error message into my native language.
Now, error message is
error message
How to change it? please help me.
Product model:
class Product < ApplicationRecord
belongs_to :item
belongs_to :user
belongs_to :branch
validates :amount, numericality: {greater_than_or_equal_to: 0}
def item_name
item.try(:name)
end
def item_name=(query)
self.item = Item.find_by_name(query) if query.present?
end
def amount=(new_value)
if read_attribute(:amount)
#old_amount = read_attribute(:amount)
write_attribute(:amount, new_value.to_i + #old_amount)
else
write_attribute(:amount, new_value.to_i)
end
end
end
some line of local/mn.yml
activerecord:
attributes:
...
errors:
models:
subcategory:
attributes:
category_id:
invalid: "ahaha"
blank: "хоосон байж болохгүй"
category:
blank: "сонгоогүй байна."
product:
attributes:
amount:
greater_than_or_equal_to: 'Оруулах утга 0-ээс их байх ёстой.'

I suppose you want to translate "Value must be grater than or equal to 0", if that's the case, what you need to do is create a translation for that on the locale file. In Spanish will be something like this:
# config/locales/es.yml
es:
activerecord:
errors:
models:
product:
attributes:
amount:
greater_than_or_equal_to: 'What ever you want to say'
Depending on your native language, you have to create the file and define the message, I think you are doing it already, because you are using translations:
#{t('product.shineer_irsen')}
You can find more information here:
http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

You can customize the error message that you get from a model validation, in this case you need to add to your Model:
validates :age, numericality: {greater_than_or_equal_to: 0, message: 'Este campo tiene que ser positivo' }
With this, you dont need to change the view.

Related

Validation error messages not showing in form view

I have a simple model :
class Property < ApplicationRecord
belongs_to :user
has_many :invoices, dependent: :destroy
has_many :tenants, dependent: :destroy
validates :street, presence: true, length: { maximum: 50}
validates :city, presence: true, length: { maximum: 50}
validates :zip, presence: true, length: { maximum: 10}
validates :rent, presence: true, length: { maximum: 50}
def receivable
(self.rent.to_i + self.charges.to_i)
end
end
When trying in the console, the validation errors come as expected:
[2] pry(main)> prop = Property.new(street:"zzz")
=> #<Property:0x007fb99cde1cc0 id: nil, number: nil, streetype: nil, street:
"zzz", city: nil, zip: nil, rent: nil, charges: nil, user_id: nil, created_at:
nil, updated_at: nil>
[3] pry(main)> prop.save
(0.3ms) BEGIN
(0.8ms) ROLLBACK
=> false
[4] pry(main)> prop.errors.full_messages
=> ["User must exist", "City can't be blank", "Zip can't be blank", "Rent can't
be blank"]
Here is the controller:
def new
#user = current_user
#property = #user.properties.build
end
def create
#user = current_user
#property = #user.properties.create(property_params)
#property.user_id = current_user.id
if #property.save
flash[:notice] = "Nouveau Bien créé !"
redirect_to user_properties_path
else
redirect_to new_user_property_path
end
end
And here is the form view:
<div class="container center">
<div class="row white">
<div">
<h2>Nouveau bien</h2>
<%= simple_form_for([#user, #property]) do |j| %>
<%= j.input :number, label:"Numéro" %>
<%= j.input :streetype, label: "Laisser vide si nécessaire", collection: ["
","rue","boulevard","allée"] , prompt: "Choisir" %>
<%= j.input :street, label:"Nom" %>
<%= j.input :city, label:"Commune / Ville" %>
<%= j.input :zip, label:"Code Postal" %>
<%= j.input :rent, label:"Montant du Loyer" %>
<%= j.input :charges, label:"Montant des charges" %>
<br>
<%= j.submit 'Créer', class: "form-control btn btn-info" %>
<% end %>
</div>
</div>
</div>
When omitting one of the fields on purpose, the controller redirect to the correct form viw but validation error messages are not present. They use to show up but they disapeared for some reason.
Any idea why?
Thank you!
instead of redirect_to new_user_property_path in else block, you should
render 'new'
Reason: redirect instructs the browser to make the new request, because of which you end up loosing the context of #property object with it's errors. It actually makes a fresh request to new action. render will continue with the current action (which is create in this case) and render the response in new view with #property, errors and previous form body.

Form accept terms is not validated

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.

enum select in rails

I've got a problem with selecting enum value in form
here is a form
=form_for #ticket , remote: true do |f|
.errors
p
= f.label :name, class: 'label_hidden'
= f.text_field :name, placeholder:'Input your name', class:'form-control'
p
= f.label :email, class: 'label_hidden'
= f.email_field :email, placeholder:'Input your email', class:'form-control'
p
= f.label :department, class: 'label_hidden'
= f.select :department, Ticket.departments.keys , class:'form-control'
p
= f.submit 'Submit', class:'btn btn-default custom'
In my db I have a field department that is string type, also in a model I have
class Ticket < ActiveRecord::Base
enum department: [:issue, :qa, :promotion]
validates :name, :email, :subject, :body, :department, presence: true
end
When i send this form - in params everything is ok( the department param is there), also I have permitted this param in controller. Still I recieve "department can't be blank". Where I am wrong?
I suppose that you receive enum as a String, so you should convert it with setter method:
def department=(val)
self[:department] = val.to_sym
end

Rails adding error to :base not working as expected

I have a double nested form:
<%= simple_form_for #item, html: { class: "create-item-form" } do |item_builder| %>
<div class="well">
<%= item_builder.input :name, required: false, error: false, label: "item name" %>
<%= item_builder.input :description, as: :text, required: false, error: false, label: "How do users earn this item?" %>
<%= item_builder.input :tag_list, required: false, label: "Tags (these will help users find your item)" %>
<%= item_builder.simple_fields_for :user_items do |user_item_builder| %>
<%= user_item_builder.input :foo, as: :hidden, input_html: { value: "bar" } %>
<%= user_item_builder.simple_fields_for :user_item_images do |user_item_images_builder| %>
<%= user_item_images_builder.input :foo, as: :hidden, input_html: { value: "bar" } %>
<%= user_item_images_builder.input :picture, as: :file, required: false,
error: false, label: "Pictures of you earning this item",
input_html: { multiple: true,
name: "item[user_items_attributes][0][user_item_images_attributes][][picture]" } %>
<% end %>
<% end %>
</div>
<div class="clearfix">
<%= item_builder.submit 'Submit new item request', class: "btn btn-primary pull-right inherit-width" %>
</div>
<% end %>
When a user doesn't upload a file for the user_item_image I need to display an error message. I wrote a custom validation:
user_item_image.rb
class UserItemImage < ActiveRecord::Base
include PicturesHelper
attr_accessor :foo
mount_uploader :picture, PictureUploader
belongs_to :user_item
validate :picture_size
validate :has_picture
private
def has_picture
errors.add(:base, 'You must include at least one picture.') if picture.blank?
end
end
But I get the error message:
User items user item images base You must include at least one picture.
How can I rewrite the validation so that it doesn't show the attribute and only shows the message.
Why not use
validates :picture, presence: true
on your useritem model

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 %>

Resources