рдЬрдм рдореИрдВ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдФрд░ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдореИрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд░реЗрд▓ рджрд░реНрд╢рди 2 рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:
рдХрдиреНрд╡реЗрдВрд╢рди рдУрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рд╕реАрдУрд╕реА) рдФрд░
рдбреЙрди'рдЯ рд░рд┐рдкреАрдЯред рдЦреБрдж (DRY) ред рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ - рдореБрдЭреЗ рдЕрднреА рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдиреЗ рд╕рдордЭрд╛, рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЙрдореНрдореАрдж рдХреА рдХрд┐ рдЗрд╕ рдЕрджреНрднреБрдд рдврд╛рдВрдЪреЗ рдХреЗ рдзрдиреБрд╖реЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рджреЗрд╢реА рдЙрдкрдХрд░рдг рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рдПрдХ рдмрд╛рд░ рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпреЗ рдирд┐рдпрдоред рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рджреЛрдиреЛрдВ рдЪреЗрдХ рдХреЗ рд▓рд┐рдПред
рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдореИрдВ рдирд┐рд░рд╛рд╢ рдерд╛ред рдмреЙрдХреНрд╕ рд╕реЗ рд░реЗрд▓ рдореЗрдВ рдРрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╖рдп рдкрд░ рдЬреЛ рдХреБрдЫ рднреА рд╕рдВрднрд╡ рдерд╛, рд╡рд╣
рдХреНрд▓рд╛рдЗрдВрдЯ_рд╕рд╛рдЗрдб_рд╡реЗрд▓рд┐рдбреЗрд╢рди рдордгрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред
рдЙрд╕ рд╕рдордп, рдореИрдВ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЪреБрдкрдЪрд╛рдк рдЙрднрд░рддреЗ рдмреНрд▓реЙрдЧ рдкрд░ рдордгрд┐ рдХреЛ рдЬрдХрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рд╕реВрдЦреА рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ js рдХреЗ рд╕рд╛рде рдПрдХ рдХрд░реАрдмреА рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рдЕрдм рдпрд╣ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ: рдореБрдЭреЗ рд░реВрдкреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓реЗ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдореИрдВрдиреЗ js- рд╢реИрд▓реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ
validates_inclusion_of
рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдФрд░ рдордгрд┐ рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬреЗрдВ рдЬреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
- рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╕рдордп, рдПрдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдкреАрда рдФрд░ рд╕рд╛рдордиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП
- рдЬрд▓реНрджреА рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдкреЛрдВ рдкрд░ "рд▓рдЯрдХрд╛" рдЪреЗрдХ рдХрд░реЗрдВ рдФрд░ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ (рддрд░реНрдХ рдФрд░ рджреГрд╢реНрдп рджреЛрдиреЛрдВ)
рд╕рдорд╛рдзрд╛рди рдПрдХ рдЫреЛрдЯреЗ рдбреЗрдореЛ рдореЗрдВ рднреМрддрд┐рдХреАрдХреГрдд рд╣реИ:
http://sandbox.alexfedoseev.com/dry-validation/showoffрдФрд░ рдиреАрдЪреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреА рдПрдХ рдЬреЛрдбрд╝реАред
рдЙрдкрдХрд░рдг
рдореИрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдореИрдВ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рдЖрд▓рд╕реА рд╣реВрдВ, рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ js-validator рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реА рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдерд╛ред рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рд╕реЗ, рдореЗрд░реА рдкрд╕рдВрдж
jQuery рдорд╛рдиреНрдпрдХрд░рдг рдкреНрд▓рдЧрдЗрди рдкрд░ рдЧрд┐рд░ рдЧрдИред
рдпрд╣ рдмрд╕ рдЬреЗрдПрд╕-рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛
рдПрдХ рд░рддреНрди рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЪреНрдЫреА рд░реЛрд╢рдиреА рд▓реЗ рдЬрд╛рдКрдВрдЧрд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдИрдореЗрд▓ рдкрддреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓рд┐рдВрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ (рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рд╣рдо рдПрдХ рдкрддреНрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ)ред
рдЪрд▓рд┐рдП рдореБрджреНрджреЗ рдкрд░ рдЖрддреЗ рд╣реИрдВ
рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдореЙрдбрд▓ рд╣реИ -
Email
рдФрд░ рдЗрд╕рдХреА рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
email
- рдИрдореЗрд▓ рдкрддрд╛frequency
- рд╡рд╣ рдЖрд╡реГрддреНрддрд┐ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореЗрд▓рд┐рдВрдЧ рдЗрд╕ рдкрддреЗ рдкрд░ рдЬрд╛рдПрдЧреА
рдкреНрд░рддрд┐рдмрдВрдз рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ:
email
рдЖрд╡рд╢реНрдпрдХ рд╣реИemail
рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПemail
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдПрдХ рдХреБрддреНрддреЗ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде)frequency
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ, рдпрд╣ 1 рд╕реЗ 7 рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рд╣рдо рдЕрд╡рддрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ:
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' )
рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╕реЗ рдЧреБрдЬрд░реЗрдВ:
validate_url = '/emails/validate'
рд╡рд╣ рдкрддрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдХреНрд╖реЗрддреНрд░ рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ajax рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВрдЧреЗ$('#new_email, [id^=edit_email_]').validate
рд╣рдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдирдП рдИрдореЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдкрддреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВdebug: true
рд╡рд┐рдзрд┐ рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рд╢рди рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдордЬрд╝реЗ рдХрд░ рд╕рдХреЗрдВrules:
рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдХреНрд╕ рд╣реИрдВ (рдбреЙрдХ рджреЗрдЦреЗрдВ), рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╣рдо рдХреЗрд╡рд▓ 2 рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ'email[email]':
рдирд╛рдо - рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ (рд╕рд░рд▓ рдирд╛рдо рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде - рдЙрджреНрдзрд░рдгреЛрдВ рдореЗрдВ рд▓реЗрдВ)
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣реЗрдВрдЧреАред
рджреВрд░рд╕реНрде
remote: url: validate_url type: 'post'
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ -
remote
ред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╡рд┐рдзрд┐ рдХреЛ рдЕрдиреБрд░реЛрдз рдпреВрдЖрд░рдПрд▓ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЛрд╕реНрдЯ-рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ) рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдорд╛рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╡рд┐рдзрд┐ рдХреЛ
json
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ:
- рдЬрд╡рд╛рдм
true
- рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ false
, undefined
рдпрд╛ null
, рд╕рд╛рде рд╣реА рдХрд┐рд╕реА рднреА рдЕрдиреНрдп string'
рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЕрд╕рдлрд▓ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ
рдЕрдкреЗрдХреНрд╖рд┐рдд
required: true
"рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб" рдХреА рд╡рд┐рдзрд┐ред рдПрдХрдорд╛рддреНрд░ рдЬрд╛рдБрдЪ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдФрд░ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП) рд╣реИ, рдЬреЛ рд╣реИ
validates_presence_of
(рдпрд╛рдиреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдорд╛рдиреНрдпрддрд╛)ред рдпрд╣ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рд╣реИ - рдпрд╣
remote
рдкрджреНрдзрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдЦреАрдВрдЪрддрд╛ рд╣реИ рдЬрдм рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред "рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЪрд▓рд╛рдПрдВ" рдпрд╣ рдЬрд╛рдВрдЪ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдорд╛рдиреНрдпрддрд╛ рд╕реАрдзреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рддрд╛рд░реНрдХрд┐рдХ рдЬрд╛рдВрдЪ (рдФрд░) рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, ajax рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ:
- рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧреА
- рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ
app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / email_controller.rb def validate
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
рдЕрдм рд░рдгрдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рд╣рдо рдЗрд╕ рдЕрдЪреНрдЫреЗ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ - рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдХреНрдпрд╛ рд▓реМрдЯрдирд╛ рд╣реИ:
- рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ
json
рд╕реЗ, рд╣рдо рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ Email
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВрдЧреЗ - рдФрд░
ActiveModel
рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЦреАрдВрдЪреЗрдВ - рдПрдХ
ActiveModel::Errors
рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдореЛрд░реА рдореЗрдВ ActiveModel::Errors
рдЬрд╛рдПрдЧреА ( errors
рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн), рдЬрд┐рд╕рдореЗрдВ рдПрдХ @messages
рд╣реИрд╢ рд╣реЛрдЧрд╛ - рдпрд╛ рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде (рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╕рддреНрдпрд╛рдкрди рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛) рдпрд╛ рдЦрд╛рд▓реА (рдпрджрд┐ рд╕рдм рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИ) - рд╣рдо рдЗрд╕ рд╣реИрд╢ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░, рдпрджрд┐ рдпрд╣ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ
true
рдЙрддреНрддрд░ рджреЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рдЗрд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкрд╛рда рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рджреЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдкреНрд▓рдЧ-рдЗрди рдХреА рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдлрд▓ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд▓рдЧрдЗрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
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
рд╣рдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрд╢ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдбреЙрдХ рд╣рдореЗрдВ
рдмрддрд╛рддреЗ рд╣реИрдВ
рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ :
(rdb:938) email.errors['frequency']
рдпрд╣реА рд╣реИ, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рд╣рдо
params
рд╣реИрд╢ рд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:
рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓реМрдЯрддреЗ рд╣реИрдВ:
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
(рдпрд╣ рдЬрд╡рд╛рдм рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдПрд░рд░ рдирд╣реАрдВ рд╣реИ)ред
рдпрджрд┐ рд╕рд░рдгреА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ:
- рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓
@errors
рд░реВрдк рдореЗрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ "1 рд╕реЗ 7 рд╕рдорд╛рд╡реЗрд╢реА рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" (рдФрд░ рдпрджрд┐ рдХрдИ рд╣реИрдВ, рддреЛ рд╡реЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ "рдПрдХ рд╕рд╛рде рдЪрд┐рдкрдХрддреЗ рд╣реИрдВ")
рдЗрд╕рд▓рд┐рдП рд╣рдо:
- рд░реЗрд▓ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рдЦреАрдВрдЪреЗрдВ:
name = t("activerecord.attributes.email.#{field}")
- рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ, рдЗрд╕ рдирд╛рдо рдХреЛ рдПрдХ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
@errors.map! { |e| "#{name} #{e}
" }
- рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рднреА рдЫрдбрд╝реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ
рд╣рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИ:
"рдЖрд╡реГрддреНрддрд┐ 1 рд╕реЗ 7 рд╕рдорд╛рд╡реЗрд╢реА рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред
"рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ - рд╣рдо рдЗрд╕реЗ рд╕рднреА рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ:
respond_to do |format| format.json { render json: @errors } end
рд░реЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
refactor
рдПрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдИ рдореЙрдбрд▓ рд╣реЛрдВрдЧреЗред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдорд╛рд░реНрдЧ рдФрд░ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рд░реНрдЧ
config / рдорд╛рд░реНрдЧреЛрдВ .rb
рдорд╛рдиреНрдпрддрд╛ рд╡рд┐рдзрд┐
рд╣рдо
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рдЕрджреНрдпрддрди: рд╢реАрд░реНрд╖рдХ рдХрд╛ рд╕рдВрдкрд╛рджрди рдХрд┐рдпрд╛