рд░реЗрд▓: рдбреНрд░рд╛рдп рд╕реНрдЯрд╛рдЗрд▓ рдЕрдЬрд╛рдХреНрд╕ рд╕рддреНрдпрд╛рдкрди

рдЬрдм рдореИрдВ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдФрд░ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдореИрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд░реЗрд▓ рджрд░реНрд╢рди 2 рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: рдХрдиреНрд╡реЗрдВрд╢рди рдУрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рд╕реАрдУрд╕реА) рдФрд░ рдбреЙрди'рдЯ рд░рд┐рдкреАрдЯред рдЦреБрдж (DRY) ред рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ - рдореБрдЭреЗ рдЕрднреА рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдиреЗ рд╕рдордЭрд╛, рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЙрдореНрдореАрдж рдХреА рдХрд┐ рдЗрд╕ рдЕрджреНрднреБрдд рдврд╛рдВрдЪреЗ рдХреЗ рдзрдиреБрд╖реЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рджреЗрд╢реА рдЙрдкрдХрд░рдг рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рдПрдХ рдмрд╛рд░ рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпреЗ рдирд┐рдпрдоред рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рджреЛрдиреЛрдВ рдЪреЗрдХ рдХреЗ рд▓рд┐рдПред

рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдореИрдВ рдирд┐рд░рд╛рд╢ рдерд╛ред рдмреЙрдХреНрд╕ рд╕реЗ рд░реЗрд▓ рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╖рдп рдкрд░ рдЬреЛ рдХреБрдЫ рднреА рд╕рдВрднрд╡ рдерд╛, рд╡рд╣ рдХреНрд▓рд╛рдЗрдВрдЯ_рд╕рд╛рдЗрдб_рд╡реЗрд▓рд┐рдбреЗрд╢рди рдордгрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред

рдЙрд╕ рд╕рдордп, рдореИрдВ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЪреБрдкрдЪрд╛рдк рдЙрднрд░рддреЗ рдмреНрд▓реЙрдЧ рдкрд░ рдордгрд┐ рдХреЛ рдЬрдХрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рд╕реВрдЦреА рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ js рдХреЗ рд╕рд╛рде рдПрдХ рдХрд░реАрдмреА рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рдЕрдм рдпрд╣ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ: рдореБрдЭреЗ рд░реВрдкреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓реЗ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдореИрдВрдиреЗ js- рд╢реИрд▓реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ validates_inclusion_of рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдФрд░ рдордгрд┐ рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬреЗрдВ рдЬреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
  1. рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдкреАрда рдФрд░ рд╕рд╛рдордиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП
  2. рдЬрд▓реНрджреА рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдкреЛрдВ рдкрд░ "рд▓рдЯрдХрд╛" рдЪреЗрдХ рдХрд░реЗрдВ рдФрд░ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ (рддрд░реНрдХ рдФрд░ рджреГрд╢реНрдп рджреЛрдиреЛрдВ)

рд╕рдорд╛рдзрд╛рди рдПрдХ рдЫреЛрдЯреЗ рдбреЗрдореЛ рдореЗрдВ рднреМрддрд┐рдХреАрдХреГрдд рд╣реИ: http://sandbox.alexfedoseev.com/dry-validation/showoff

рдФрд░ рдиреАрдЪреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреА рдПрдХ рдЬреЛрдбрд╝реАред

рдЙрдкрдХрд░рдг


рдореИрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдореИрдВ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рдЖрд▓рд╕реА рд╣реВрдВ, рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ js-validator рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реА рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдерд╛ред рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рд╕реЗ, рдореЗрд░реА рдкрд╕рдВрдж jQuery рдорд╛рдиреНрдпрдХрд░рдг рдкреНрд▓рдЧрдЗрди рдкрд░ рдЧрд┐рд░ рдЧрдИред

рдпрд╣ рдмрд╕ рдЬреЗрдПрд╕-рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рд░рддреНрди рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЪреНрдЫреА рд░реЛрд╢рдиреА рд▓реЗ рдЬрд╛рдКрдВрдЧрд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдИрдореЗрд▓ рдкрддреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓рд┐рдВрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ (рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рд╣рдо рдПрдХ рдкрддреНрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ)ред

рдЪрд▓рд┐рдП рдореБрджреНрджреЗ рдкрд░ рдЖрддреЗ рд╣реИрдВ


рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдореЙрдбрд▓ рд╣реИ - Email
рдФрд░ рдЗрд╕рдХреА рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

рдкреНрд░рддрд┐рдмрдВрдз рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ:


рд╣рдо рдЕрд╡рддрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ:

app / рдореЙрдбрд▓ / email.rb

 class Email < ActiveRecord::Base before_save { self.email = email.downcase } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-.]+\.[az]+\z/i validates :email, presence: true, uniqueness: { case_sensitive: false }, format: { with: VALID_EMAIL_REGEX } validates_inclusion_of :frequency, in: 1..7, allow_blank: true end 


рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреГрд╢реНрдп рдореЗрдВ, рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рдорд╛рдирдХ рд╣реИ
app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / email_controller.rb

 class EmailsController < ApplicationController def new @email = Email.new end def create @email = Email.new(email_params) if @email.save flash[:success] = 'Email !' redirect_to emails_url else render :new end end private def email_params params.require(:email).permit(:email, :frequency) end end 


рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡рд┐рдЪрд╛рд░ / рдИрдореЗрд▓ / new.html.haml

 %h1   = form_for @email do |f| = render partial: 'shared/error_messages', locals: { object: f.object } %p= f.text_field :email, placeholder: '' %p= f.text_field :frequency, placeholder: ' ' %p= f.submit '!' 



рдЕрдЧрд▓рд╛ рдХрджрдо рдлреЙрд░реНрдо рдкрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рд╣реИ рдФрд░ рджреЗрдЦрдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реИред
рдпрд╣ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: $('#form').validate();
рдореИрдВ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдЕрдм рд╡рд╛рдкрд╕ рди рдЖрдПред рд╕рдВрд░рдЪрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

рддреЛ, рд╣рдо рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ:

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╕рдВрдкрддреНрддрд┐ / javascripts / email.js.cfish

 jQuery -> validate_url = '/emails/validate' $('#new_email, [id^=edit_email_]').validate( debug: true rules: 'email[email]': required: true remote: url: validate_url type: 'post' 'email[frequency]': remote: url: validate_url type: 'post' ) 


рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╕реЗ рдЧреБрдЬрд░реЗрдВ:

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣реЗрдВрдЧреАред

рджреВрд░рд╕реНрде

 remote: url: validate_url type: 'post' 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ - remote ред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╡рд┐рдзрд┐ рдХреЛ рдЕрдиреБрд░реЛрдз рдпреВрдЖрд░рдПрд▓ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЛрд╕реНрдЯ-рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ) рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдорд╛рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЛ json рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ:


рдЕрдкреЗрдХреНрд╖рд┐рдд

 required: true 

"рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб" рдХреА рд╡рд┐рдзрд┐ред рдПрдХрдорд╛рддреНрд░ рдЬрд╛рдБрдЪ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдФрд░ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП) рд╣реИ, рдЬреЛ рд╣реИ validates_presence_of (рдпрд╛рдиреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдорд╛рдиреНрдпрддрд╛)ред рдпрд╣ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рд╣реИ - рдпрд╣ remote рдкрджреНрдзрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдЦреАрдВрдЪрддрд╛ рд╣реИ рдЬрдм рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред "рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЪрд▓рд╛рдПрдВ" рдпрд╣ рдЬрд╛рдВрдЪ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдорд╛рдиреНрдпрддрд╛ рд╕реАрдзреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рддрд╛рд░реНрдХрд┐рдХ рдЬрд╛рдВрдЪ (рдФрд░) рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП


рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, ajax рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ:


app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / email_controller.rb

  def validate #   end 


config / рдорд╛рд░реНрдЧреЛрдВ .rb

 resources :emails post 'emails/validate', to: 'emails#validate', as: :emails_validation 


рдорд╣рд╛рди, рдЕрдм рд╕рд░реНрд╡рд░ '/emails/validate' рдкрддреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЖрдЗрдП рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ Email рдирд┐рд░реНрдорд╛рдг рдлреЙрд░реНрдо рдЦреЛрд▓реЗрдВ (lvh.meeps000000 / email / new), рдлреЙрд░реНрдо рдлрд╝реАрд▓реНрдб рдореЗрдВ "рдХреБрдЫ" рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдЪрд▓рд╛рдПрдБ - рджреЗрдЦреЗрдВ рдХрд┐ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 Started POST "/emails/validate" for 127.0.0.1 at 2014-02-17 22:10:31 +0000 Processing by EmailsController#validate as JSON Parameters: {"email"=>{"frequency"=>"-"}} 

рдЕрдм рд░рдгрдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рд╣рдо рдЗрд╕ рдЕрдЪреНрдЫреЗ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ - рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдХреНрдпрд╛ рд▓реМрдЯрдирд╛ рд╣реИ:

Sho-ko-рддрд░реАрдХрд╛! рди рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╕реАрдзреЗ рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдмрд▓реНрдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕реАрдзреЗ рд░реЗрд▓ рд▓реЛрдХреЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╡реИрд╕реЗ, рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рджреЛред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ / рд╕реНрдерд╛рди / ru.yml

 ru: activerecord: attributes: email: email: "" frequency: "" errors: models: email: attributes: email: blank: "" taken: "    " invalid: "  " frequency: inclusion: "     1  7 " 

рд╣рдордиреЗ рд░реЗрд▓ рдЧрд╛рдЗрдб рдореЗрдВ I18n рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛: http://guides.rubyonrails.org/i18n.html

рдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрддрд╛рдИ рдЬрд╛рддреА рд╣реИред
рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рддреБрд░рдВрдд рдХрд╛рдо рдХреЛрдб рдХреЛ рдбрдВрдк рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВрдЧреЗ:

app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / email_controller.rb

 def validate email = Email.new(email_params) email.valid? field = params[:email].first[0] @errors = email.errors[field] if @errors.empty? @errors = true else name = t("activerecord.attributes.email.#{field}") @errors.map! { |e| "#{name} #{e}<br />" } end respond_to do |format| format.json { render json: @errors } end end 


рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред

 email = Email.new(email_params) email.valid? 

рд╣рдо рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдлреЙрд░реНрдо рд╕реЗ рдЖрдП рд╣реИрдВ рдФрд░ рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ ActiveModel::Errors рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдореЛрд░реА рдореЗрдВ ActiveModel::Errors ред @messages рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИрд╢ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрджреЗрд╢ рд╣реЛрдВрдЧреЗ (рдЪреВрдВрдХрд┐ рдЕрдиреНрдп рд╕рднреА рдХреЗ рдорд╛рди nil , рдХреЗрд╡рд▓ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдЖрдпрд╛ рд╣реИ)ред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдХреИрд╕реЗ рд╕рдордЭрддреА рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХреИрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП:

 (rdb:938) email.errors #=> #<ActiveModel::Errors:0x007fbbe378dfb0 @base=#<Email id: nil, email: nil, frequency: "-", created_at: nil, updated_at: nil>, @messages={:email=>["", "  "], :frequency=>["     1  7 "]}> 

рд╣рдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрд╢ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдбреЙрдХ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ :

 (rdb:938) email.errors['frequency'] #=> ["     1  7 "] 

рдпрд╣реА рд╣реИ, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рд╣рдо params рд╣реИрд╢ рд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:

 #    (rdb:938) params #=> {"email"=>{"frequency"=>"-"}, "controller"=>"emails", "action"=>"validate"} #    ,    (rdb:938) params[:email] #=> {"frequency"=>"-"} #       ,    (rdb:938) params[:email].first #=> ["frequency", "-"] #      ,     ->  (rdb:938) params[:email].first[0] #=> "frequency" 

рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓реМрдЯрддреЗ рд╣реИрдВ:

 field = params[:email].first[0] @errors = email.errors[field] 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдореЙрдбрд▓ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдорд┐рд▓рд╛, рдлрд┐рд░ рд╣рдордиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдЦреАрдВрдЪреАред

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

 if @errors.empty? @errors = true else name = t("activerecord.attributes.email.#{field}") @errors.map! { |e| "#{name} #{e}<br />" } end 

рдпрджрд┐ рдПрд░рд░ рд╡рд╛рд▓реА рдПрд░реЗ рдЦрд╛рд▓реА рд╣реИ, рддреЛ @errors рд╡реЗрд░рд┐рдПрдмрд▓ true (рдпрд╣ рдЬрд╡рд╛рдм рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдПрд░рд░ рдирд╣реАрдВ рд╣реИ)ред

рдпрджрд┐ рд╕рд░рдгреА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ:

рдЗрд╕рд▓рд┐рдП рд╣рдо:

рд╣рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИ:
"рдЖрд╡реГрддреНрддрд┐ 1 рд╕реЗ 7 рд╕рдорд╛рд╡реЗрд╢реА рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред "

рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ - рд╣рдо рдЗрд╕реЗ рд╕рднреА рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ:

 respond_to do |format| format.json { render json: @errors } end 

рд░реЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред

refactor


рдПрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдИ рдореЙрдбрд▓ рд╣реЛрдВрдЧреЗред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдорд╛рд░реНрдЧ рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╛рд░реНрдЧ

config / рдорд╛рд░реНрдЧреЛрдВ .rb

 #  post 'emails/validate', to: 'emails#validate', as: :emails_validation #        post ':controller/validate', action: 'validate', as: :validate_form 


рдорд╛рдиреНрдпрддрд╛ рд╡рд┐рдзрд┐

рд╣рдо application_controller.rb рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / application_controller.rb

 def validator(object) object.valid? model = object.class.name.underscore.to_sym field = params[model].first[0] @errors = object.errors[field] if @errors.empty? @errors = true else name = t("activerecord.attributes.#{model}.#{field}") @errors.map! { |e| "#{name} #{e}<br />" } end end 


app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / email_controller.rb

 def validate email = Email.new(email_params) validator(email) respond_to do |format| format.json { render json: @errors } end end 

PS рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ onkeyup: false рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЛ рдЭрдЯрдХрд╛ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, onkeyup: false рд╡рд┐рдзрд┐ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ onkeyup: false

jQuery рдорд╛рдиреНрдпрддрд╛ рдкреНрд▓рдЧрд┐рди:
http://jqueryvalidation.org

рдзрдиреБрд╖ рдХреЗ рд╕рд╛рде рдбреЗрдореЛ:
http://sandbox.alexfedoseev.com/dry-validation/showoff

рдЕрджреНрдпрддрди: рд╢реАрд░реНрд╖рдХ рдХрд╛ рд╕рдВрдкрд╛рджрди рдХрд┐рдпрд╛

Source: https://habr.com/ru/post/In213077/


All Articles