Range unspecified in Rails validation - ruby-on-rails

I have the following code in my model:
class Tweet < ActiveRecord::Base
validates_length_of :content, length: { maximum: 140 }
and the following validation in my controller:
def new
#tweet = Tweet.new
#maximum_length = Tweet.validators_on( :content ).first.options[:maximum]
end
And I get the following error message in my browser. I have no idea what's wrong with this!
Range unspecified. Specify the :in, :within, :maximum, :minimum, or :is option.
My view is:
<div class="form-group">
<%= form_for #tweet do |f| %>
chars left: <span id="counter" data-maximum-length = "<%=#maximum_length%>"<%= #maximum_length%></span>
<%= f.text_field :content, maxlength: #maximum_length, id: 'content' %>
<button type="submit" class="btn btn-primary">Submit</button>
<%end%>
<script>
$(document).ready(function(){
var content = $("#content");
var counter = $("#counter");
var max_length = counter.data("maximum_length");
content.keyup(function(){
counter.text(max_lnegth - $(this).val().length);
});
});
</script>

Use validates instead. This is the preferred method for all validations (view the Rails Validation Docs
validates :content, length: { maximum: 140 }
Using validates_length_of like you have in your code, it would be written as:
validates_length_of :content, maximum: 140

validates_length_of :content, maximum: 140

Related

impossible to encrypt a password in a multi-step form with bcrypt

I'm a beginner in ruby on rails and I have a problem encrypting a password in my registration form. I installed the bcrypt gem but I don't understand why the form doesn't work...
my form model :
module Wizard
module User
STEPS = %w(step1 step2 step3).freeze
class Base
include ActiveModel::Model
include ActiveModel::SecurePassword
attr_accessor :user
has_secure_password
delegate *::User.attribute_names.map { |attr| [attr, "#{attr}="] }.flatten, to: :user
def initialize(user_attributes)
#user = ::User.new(user_attributes)
end
end
class Step1 < Base
validates :firstName, presence: {
message: 'Un prénom doit être renseigné'
}, length: { maximum: 50,
too_long: '50 caractères maximum pour le prénom' }
validates :lastName, presence: {
message: 'Un nom doit être renseigné'
}, length: { maximum: 50,
too_long: '50 caractères maximum pour le nom' }
VALID_EMAIL_REGEX = /\A[\w+\-.]+#[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255,
too_long: '255 caractères maximum pour l\'adresse mail' },
format: { with: VALID_EMAIL_REGEX,
message: 'Vous devez saisir une adresse mail valide' }
end
class Step2 < Step1
validates :password, presence: true, length: { in: 8..15 }, length: { in: 8..15 }
end
class Step3 < Step2
validates :school, presence: true
validates :typeOfTeacher, presence: true
validates :yearsOfExperience, presence: true
end
end
end
My model User.rb :
class User < ApplicationRecord
validates :firstName, presence: true, length: { maximum: 50 }
validates :lastName, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+#[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: true
has_secure_password
validates :password, presence: true
validates :school, presence: true
validates :typeOfTeacher, presence: true
validates :yearsOfExperience, presence: true
end
My controller :
When saving the user in my create function. The registration stops because of the password. I think I'm using wrong has_secure_password.
class WizardsController < ApplicationController
before_action :load_user_wizard, except: %i(validate_step)
def validate_step
current_step = params[:current_step]
#user_wizard = wizard_user_for_step(current_step)
#user_wizard.user.attributes = user_wizard_params
session[:user_attributes] = #user_wizard.user.attributes
if #user_wizard.valid?
next_step = wizard_user_next_step(current_step)
create and return unless next_step
redirect_to action: next_step
else
render current_step
end
end
def create
if #user_wizard.user.save
session[:user_attributes] = nil
redirect_to letsgo_path
else
redirect_to({ action: Wizard::User::STEPS.first } )
end
end
private
def load_user_wizard
#user_wizard = wizard_user_for_step(action_name)
end
def wizard_user_next_step(step)
Wizard::User::STEPS[Wizard::User::STEPS.index(step) + 1]
end
def wizard_user_for_step(step)
raise InvalidStep unless step.in?(Wizard::User::STEPS)
"Wizard::User::#{step.camelize}".constantize.new(session[:user_attributes])
end
def user_wizard_params
params.require(:user_wizard).permit(:firstName, :lastName, :email, :password, :password_confirmation, :school, :typeOfTeacher, :yearsOfExperience)
end
class InvalidStep < StandardError; end
end
My view :
<div class="div_Signup">
<div class="div_SignupBlock">
<%= render 'navbarSignup' %>
<div class="div_SignupBlockInt">
<div class="div_SignupText">
Inscription
</div>
<div class="div_SignupTextName">
Choisissez un mot de passe
</div>
<div class="div_SignupForm">
<%= form_for #user_wizard, as: :user_wizard, url: validate_step_wizard_path do |f| %>
<%= hidden_field_tag :current_step, 'step2' %>
<div class="div_SignupInputPassword">
<%= f.password_field :password, placeholder: 'Mot de passe', :class => field_class(#user_wizard, :password) %>
<% #user_wizard.errors[:password].each do |message| %>
<p style="color: red;"><%= message %></p>
<% end %>
</div>
<div class="div_SignupInputPasswordConfirmation">
<%= f.password_field :password_confirmation, placeholder: 'Confirmation du mot de passe', class: 'input_Signup' %>
</div>
</div>
<%= f.submit 'Suivant', class: 'button_Signup' %>
<% end %>
</div>
<footer class="footer_Signup">
<%= render 'footerSignup2' %>
</footer>
</div>
</div>
When I test my form when entering a password, I get error messages that show that the password cannot be empty, and the password confirmation field does not work.
However, I see that the password has been encrypted.
Thanks !!!

How to change change error messages 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.

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.

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

Ruby: How can i make a combobox that shows

i want to know how to make a commbobox that shows a list of all users in my database, let me explain myself:
I have two clases:
class User < ActiveRecord::Base
validates :password, presence: true, confirmation: {strict: true}
validates :password_confirmation, presence: true
validates :telephone, uniqueness: true, presence: true, numericality: { only_integer: true }, presence: true, length: { minimum: 9, maximum: 9 }
validates :name, presence: true, length: { minimum: 4, maximum: 30 }, format: { with: /^[\w\s-]*/u, multiline: true,
message: 'only allows letters' }
has_many :valorations
end
class Valoration < ActiveRecord::Base
validates :points, presence:true, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }
belongs_to :user
belongs_to :hability
end
And i have a show create view for the validation class:
<%= form_for(#valoration) do |f| %>
...errors check...
<div class="field">
#combo box code to be added
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
And what i wanna do is to create a combo box that does something like the following pseudocode using fselect:
Invented code:
<%= f.select :user_id, options_for_select( for_each user do |u|
[[u.name,u.id]]
end %>
So at the end i have an combobox with all the users, i'm a noob to rails really know how to do it so any help is welcome
You can do something like below to achieve what you want.
<%= f.select :user_id, User.all.collect { |u| [ u.name, u.id ] } %>
For more info, you can refer to this link

Resources