
рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рдЕрдкрдиреА рдЦреБрдж рдХреА рд░реЗрд▓ рд░рддреНрди рд▓рд┐рдЦрдиреЗ рдХреА рдПрдХ рдЕрдердХ рдЗрдЪреНрдЫрд╛ рдереАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реИрдХреНрд╖рдгрд┐рдХ рд░реБрдЪрд┐ - рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛ рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреА рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдордгрд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдмреЗ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдереЗ (
рд╕рдордп рджреЛ рддреАрди )
рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкреВрд░реНрдг рд░рддреНрди рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ - рд╡реЗ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рд╣реИрдВ рдФрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХрдВрдЬреВрд╕ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИрдВред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╡реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рд░реАрдбрдореА рдФрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдордгрд┐ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреА рд╣реИред
рд╕рдорд╕реНрдпрд╛
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдпрд╣ рдХреИрд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╣реИ - рдореИрдВрдиреЗ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдЖрдк рдЯреЛрдкреА рддреИрдирд╛рдд рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ
тАЬрдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ред
рдпрджрд┐ рдЖрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕реНрд╡рд╛рдореА рд╣реИрдВ рддреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред тАЭ
рдЦреИрд░, рддреЛ - рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП ssh, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рдЦреБрджрд╛рдИ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдбреАред рд╡рд┐рдо рдФрд░ рдЗрдореИрдХ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рдЬреЛ рднреА рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдорджрдж рд╕реЗ рд▓реЙрдЧ рдореЗрдВ рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдПрдХ рдФрд░ рд╕рдмрдХ рд╣реИред рдЯреЗрд▓рдлрд╝ рдЪрд▓рд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЕрд╕рднреНрдп рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЬрдбрд╝ рдирд╣реАрдВ рд▓реАред
рд╡рд┐рдЪрд╛рд░
рдПрдХ рдордгрд┐ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЯреЗрд▓ рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджрд┐рдП рдЧрдП рдкрде рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд▓реЙрдЧ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА .log рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ
рддреБрд░рдВрдд рджрд┐рдЦрд╛рдУ рдХрд┐ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ:
рдЖрдкрдХреЛ рдХреЗрд╡рд▓ Gemfile рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реИ
gem 'tail'
рдордгрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
bundle install
рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ (
config/routes.rb
) рдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБ рдкрд░ рдорд╛рдЙрдВрдЯ рдХрд░реЗрдВ
mount Tail::Engine, at: "/tail"
рдЗрд╕рдХреЗ рдмрд╛рдж рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░
рдпрд╣ рдкреГрд╖реНрда рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди Devise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ (
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ) рдХреЗ
рд▓рд┐рдП рд╕рд┐рдирд╛рддреНрд░рд╛-рдЖрдзрд╛рд░рд┐рдд рд░рддреНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдкрдиреЗ рдордгрд┐ рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджреБ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд░реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ рдФрд░ рдкрд╛рдкрд╛рддреНрд░рд╛ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдордгрд┐ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА:
class LogsController < ApplicationController before_filter :authenticate_user! if defined? Devise def index @web_logger ||= Log.instance @web_logger.n = params[:n] log_file_name = params[:file_name] || "
рдпрд╣ рд╕рд░рд▓ рд╣реИ, рд╣рдо рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП .log рдлрд╝рд╛рдЗрд▓ рд╕реЗ рджреА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд▓реЙрдЧ рдХреНрд▓рд╛рд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред рдЬрдм рддрдХ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рд╡рд┐рдзрд┐ рдирд╣реАрдВ:
@files.include?(file_name) ? `tail -n #{@n} log/#{file_name}`.lines : []
рд░реВрдмреА рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдУрдПрд╕ рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдмрд╕ рдЗрд╕реЗ рдЗрди рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ (рдирд░рдХ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╡рд░реНрдг:
`tail -n 40 production.log`
- рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЕрдВрддрд┐рдо 40 рд▓рд╛рдЗрдиреЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкрд░рд┐рд╖реНрдХреГрдд рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдврд╛рдВрдЪрд╛ -
рд╡реЗрдирд┐рд▓рд╛.рдЬреЗрдПрд╕ ) рд╕реНрдХреНрд░реАрди рдХреЛ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рддрдХ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рддреА рд╣реИ:
'window.scrollTo(0, document.body.scrollHeight);'
рд╣рдо рдЖрд╡реЗрджрди рд╕реЗ рдордгрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╣реИрдмреЗ рдФрд░ рд╕рдореНрдорд╛рдирд┐рдд рд░реЗрдпрд╛рди рдмреЗрдЯреНрд╕ рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдмрдВрдбрд▓ рдЬреЗрдо рдХрдорд╛рдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордгрд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд╡реАрдирддрдо рд╡реАрдбрд┐рдпреЛ рдирд╡рдВрдмрд░ 2011 рддрдХ рдХрд╛ рд╣реИред
рдЕрдм
рдЗрдВрдЬрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЗрд▓ рд░рддреНрди рдмрдирд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИред
рдЗрдВрдЬрди рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдФрд░ рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдореВрд▓ рдПрдХ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ (рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ) рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд┐рдпрд╛рдореА рдЬреБрдбрд╝рд╡рд╛рдБ рдмрдЪреНрдЪреЗред рдпрд╛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд╕рдВрдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдгред рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдирдП рдЗрдВрдЬрди / рдкреНрд▓рдЧрдЗрди / рдордгрд┐ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдмрд┐рдВрджреБ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдкрддреЗ рдкрд░ рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЖрджрд┐рдо рд╣реИ, рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░, рдЬреЛ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдореИрдВрдиреЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╡реЗрд╢, рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдХреЗ рд░рддреНрди, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрдЖрджрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ, рдЬреЛ рдПрдХ рддрд░рдл, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЗрддрдирд╛ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рд░реЗрд▓ рдХреА рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред - рдореЙрдбрд▓, рдирд┐рдпрдВрддреНрд░рдХ, рд╡рд┐рдЪрд╛рд░, рдЖрджрд┐ред
рдЕрдиреНрдпрдерд╛, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ, рдорд╛рдЗрдЧреНрд░реЗрд╢рди, рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓, рд╕реБрд░рдХреНрд╖рд╛, рдЖрджрд┐ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдкрд╕реАрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЧреЛрд▓реЛрд╡рд┐рдХ рдЕрднреА рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдЖрдк
рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд░рддреНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЗрд╡рд▓ рд╕реАрдорд┐рдд рд░реЗрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рд╕рд╣рд╛рдпрдХ рдпрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдирд╛) -
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ
рддреЛ, рдкреВрдВрдЫ рдирд╛рдордХ рднрд╡рд┐рд╖реНрдп рдХрд╛ рд░рддреНрди рдмрдирд╛рдПрдВ
rails plugin new tail --mountable
--mountable
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдЙрдВрдЯреЗрдмрд▓ рдЗрдВрдЬрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдкреНрд▓рдЧрдЗрди рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛рд░реЗрд▓ рдкреНрд▓рдЧрдЗрди рдирдИ рдкреВрдВрдЫ - рдЙрд▓реНрд▓реЗрдЦрдиреАрдп -рд╕реНрдХрд╛рдЗрдк-рд╕рдХреНрд░рд┐рдп-рд░рд┐рдХреЙрд░реНрдб
рдЪреВрдВрдХрд┐ рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред
рдмрд╣реБрдд рдордЬрд╝реЗрджрд╛рд░ рдЯреАрдо рд╣реИред рдпрджрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрдирд╛рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░
bundle gem
рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реЛрдЧрд╛ред
рддреАрди рдореБрдЦреНрдп рдмрд┐рдВрджреБ:
рдкрд╣рд▓реЗ
engine.rb
рдлрд╝реЛрд▓реНрдбрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдордгрд┐ рдХрд╛ рдЖрдзрд╛рд░ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓
engine.rb
рд╣реИред
engine.rb
module Tail class Engine < ::Rails::Engine isolate_namespace Tail end end
рдордгрд┐ рдирд╛рдордХ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдкреГрдердХ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рд╕рднреА рдореЙрдбрд▓, рдирд┐рдпрдВрддреНрд░рдХ, рджреГрд╢реНрдп рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рд▓рдкреЗрдЯреА рдЬрд╛рдПрдВрдЧреАред рдпрд╛рдиреА
SomeClass
рдХреНрд▓рд╛рд╕ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рдкрд╛рд╕
Tail::SomeClass
, рдЬреЛ рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
messages_path
рдЖрдк
tail.messages_path
рдпрджрд┐ рдЖрдкрдХреЛ рдордгрд┐ рд╡реЗрдм рднрд╛рдЧ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рдпрд╣ рдордгрд┐ рдХреЗ рдирд╛рдо рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдЯрдХрд░рд╛рд╡ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
app/
рдореЗрдВ
app/
рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдордгрд┐ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВред рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда рджреВрд╕рд░рд╛,
.gemspec рдлрд╝рд╛рдЗрд▓ - pesonal рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рд░рддреНрдиреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред
lib / version.rb - gem'a рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ред рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк
semver.org рдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЬреЗрдо'рдП рдХреЗ рдЕрдЧрд▓реЗ рдкреНрд░рдХрд╛рд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред
рдФрд░ рддреАрд╕рд░рд╛:
рдкрд░реАрдХреНрд╖рдг / рдбрдореА рдлрд╝реЛрд▓реНрдбрд░ - рдЗрд╕рдореЗрдВ рдПрдХ рдлрд░реНрдЬреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (/test/dummy/config/routes.rb)ред рдпрд╛рдиреА, рдордгрд┐ рдХреЗ рдХрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рд░реЗрд▓ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВред рдореЗрд░рд╛ рдЖрд╡реЗрджрди рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 3000 / рдкреВрдВрдЫ рдкрд░ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда рдордгрд┐ рднрд░реЗрдВ
rails generate resource log
рдореИрдВ рдордЪрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдЖрд░рдпреВрдбреА рдФрд░ рдкреАрдврд╝реА рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЛрдб рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐
test/dummy
рд╕реЗ рдирдХрд▓реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдХрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдм рдХреБрдЫ, рдЕрдм рд╕реЗ, рдордгрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
gem 'tail', path: '~/projects/tail'
рдпрд╛
gem 'tail' , git: 'git://github.com/k2m30/tail.git'
рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдордгрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ
bundle update tail
ред
рдкреНрд░рдХрд╛рд╢рди
рдорд╛рдгрд┐рдХ рдкрд░ рд░рддреНрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ
рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд░рддреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
рдордгрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
rake build
рд╣реЗрд▓реНрдкрд░ рдЯреАрдо
gem push
рдпрд╣ рдордгрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рд░реВрдмреАрдЧреИрдореНрд╕ рдХреНрд░реЗрдбрд┐рдЯ рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрддрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рдиред
rake release
рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдордгрд┐ рд░реВрдмреАрдЬ рдкрд░ рдПрдХ рдЦреЛрдЬ рдореЗрдВ
рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдФрд░ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдордгрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░
1. рдПрдХ рдорд╛рдЙрдВрдЯреЗрдмрд▓ рд░реЗрд▓ рд░рддреНрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
рдХрдВрдХрд╛рд▓ рдмрдирд╛рдПрдБ
rails plugin new tail --mountable
2. рдПрдХ рдкрд░рд┐рдЪрд┐рдд рд░реЗрд▓ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рднрд░реЗрдВ
рдорд╛рдореВрд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрдо рд╣реИрдВ рдФрд░ рд╡реЗ
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВредрдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдкрдиреЗ
test/dummy/
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
rails server
рдЪрд▓рд╛рдХрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛
3. рдПрдХ рд░рддреНрди рдмрдирд╛рдПрдБ
rake build
4. rubygems.org рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ:
gem push
рдЬрд╛рд░реА рдХрд░реЛ
rake release
рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдЖрдк рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдордгрд┐ рдХреЗ рдЦреБрд╢ рдорд╛рд▓рд┐рдХ рд╣реИрдВ
рд╡реИрд╕реЗ, рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп рдорд╛рдгрд┐рдХ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реЗ рдордгрд┐ рдХреЛ 151 рдмрд╛рд░ рдкрд╣рд▓реЗ рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдордгрд┐ рд╡реЗрдмрдЯреЗрд▓ рд▓реЙрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реЙрдХреЗрдЯ рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд▓реЙрдЧ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрдЭреЗ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛, рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рдлрд╛рдпрд░рд╡реЙрд▓ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдиреГрддреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реБрдВрджрд░ рд╣реИред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд▓реЗрдЦ, рдФрд░ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рдордгрд┐ рдЕрдкрдиреЗ рдЖрдк рдЙрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рдХреЗ рд╕рдордп рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред
рд╕рдВрджрд░реНрдн
http://wangjohn.imtqy.com/railties/rails/gsoc/2013/07/10/introduction-to-railties.htmlhttp://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.htmlрд░реВрд╕реА рдореЗрдВ рд░реЗрд▓Github.com рдкрд░ рд╣реА рд░рддреНрдирд╡рд╣ rubygems.org рдкрд░ рд╣реИ