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

рдлрд┐рд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдореЙрдбрд▓ рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ-рд░рд┐рд▓реЗрд╢рдирд▓ рдХрдиреНрд╡рд░реНрдЯрд░ (рдСрдмреНрдЬреЗрдХреНрдЯ-рд░рд┐рд▓реЗрд╢рдирд▓ рдореИрдкрд░, ORM), рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрдЯрд┐рд▓ рдврд╛рдВрдЪреЗ рдЬреИрд╕реЗ ASP.NET MVC рдпрд╛ рд░реВрдмреА рд░реЗрд▓реНрд╕ рдкрд░, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ - рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдврд╛рдВрдЪреЗ рдХреЗ рдкрде рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╢реБрд░реВ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧреЗред рдпрд╣рд╛рдВ рдЖрдк рдПрдХ рдмрдбрд╝реА рдзрд╛рд░рдгрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдбреЛрдореЗрди-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдирдХрд╛рд░ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдХрд┐рд╕реА рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдХреЗрд╡рд▓ рд╕рд┐рдВрдереИрдЯрд┐рдХ рдЯреВрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд░рд╣рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдореИрдВ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рд╕реА #, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд░реВрдмреАред рднрд╛рдЧреНрдп рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдФрд░ рд╕реА # рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдореЗрд░реА рдкреНрд░реЗрд░рдгрд╛ рд╣реИрдВ, рдЬреЗрдПрд╕ рдореЗрд░реА рдореБрдЦреНрдп рдЖрдп рд╣реИ, рдФрд░ рд░реВрдмреА рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд░реВрдмреА рдореЗрдВ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛: рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рддреЛ, рдореЙрдбрд▓ рдХреЛ рд░реВрдмреА рдореЗрдВ рдЗрдирд╡реЙрдЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░реЗрдВ:
class Invoice attr_reader :amount, :date, :created_at, :paid_at def initialize(attrs, payment_service) @created_at = DateTime.now @paid_at = nil @amount = attrs[:amount] @date = attrs[:date] @subscription = attrs[:subscription] @payment_service = payment_service end def pay credit_card = @subscription.customer.credit_card amount = @subscription.plan.price @payment_service.charge(credit_card, amount) @paid_at = DateTime.now end end
рдпрд╛рдиреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ, рд╡рд╕реНрддреБ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдПрдХ рд╣реИрд╢ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рднреБрдЧрддрд╛рди рд╡рд┐рдзрд┐ рдЬреЛ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддреА рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕рд┐рд░реНрдл рдореМрдЬреВрдж рд╣реИ, рд╣рдо рдЗрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рд╡рд┐рджреЗрд╢реА рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдмреЗрд╕рдЗрдиреНрдЯрд┐рдЯреА рдФрд░ рдЕрдиреНрдп рдХрдЪрд░рд╛ рдЬреЛ рдореЙрдбрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╡реИрд╕реЗ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реАрдХреНрд╖рдг (рдЯреАрдбреАрдбреА) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднреБрдЧрддрд╛рди рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреИрд╕реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
RSpec.describe Invoice do before :each do @payment_service = double(:payment_service) allow(@payment_service).to receive(:charge) @amount = 100 @credit_card = CreditCard.new({...}) @customer = Customer.new({credit_card: @credit_card, ...}) @subscription = Subscription.new({customer: customer, ...}) @invoice = Invoice.new({amount: @amount, date: DateTime.now, @subscription: subscription}, payment_service) end describe 'pay' do it "charges customer's credit card" do expect(@payment_service).to receive(:charge).with(@credit_card, @amount) @invoice.pay end it 'makes the invoice paid' do expect(@invoice.paid_at).not_to be_nil @invoice.pay end end end
рдпрд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ (рд░реВрдмреА рдХреЗ рд▓рд┐рдП irb), рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛:
irb > invoice = Invoice.new({amount: @amount, date: DateTime.now, @subscription: subscription}, payment_service) irb > invoice.pay
рдЗрд╕ рд╕реНрддрд░ рдкрд░ "рд╡рд┐рджреЗрд╢реА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ" рд╕реЗ рдмрдЪрдирд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдореЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рд╕реАрдзреЗ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рдордп, рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╡рд░рдг рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрд╕ рдЗрдЧреНрдиреЛрд░реЗрдВрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕рдВрдмрдВрдзрдкрд░рдХ рдпрд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛ, рд╣рдо рдХреЗрд╡рд▓ рдореЙрдбрд▓рд┐рдВрдЧ рдЪрд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рджреГрдврд╝рддрд╛ рдЕрдЬреНрдЮрд╛рдирддрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдиреНрдореВрд▓рди, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛, рдореЙрдбрд▓ рд╕реЗ рд╣реАред рдЙрджрд╛рд╣рд░рдг:
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореВрд▓рднреВрдд рдХрд╛рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рднреА рд╣реИ - рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди (рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд, рдПрд╕рдУрдПрд▓рдЖрдИрдбреА рдореЗрдВ)ред рдпрджрд┐ рдореЙрдбрд▓, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рд╛рдЬреНрдп рд╕рдВрд░рдХреНрд╖рдг рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдВ рд╣реИрдВред рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрд╕ рдЗрдЧреНрдиреЛрд░реЗрдВрд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдФрд░ рдЕрдВрддрд┐рдо рд▓рд╛рдн рд╕реНрдЯреЛрд░реЗрдЬ рдЯреВрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рднрдВрдбрд╛рд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ рднреАред
рдореЙрдбрд▓-рд╡реНрдпреВ-рдирд┐рдпрдВрддреНрд░рдХ
рдПрдорд╡реАрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░реЛрдВ, рди рдХреЗрд╡рд▓ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрддрдиреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ рдХрд┐ рд╣рдо рдЕрдм рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╡рд╛рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ "рдирд┐рдпрдВрддреНрд░рдХ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдореЙрдбрд▓ рдкрд░ рд╕рдореВрд╣ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрддрдирд╛ рд╣реА рдирд╣реАрдВ, рдХреНрдпрд╛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рдЬрдЧрд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕рдиреЗ .NET -> рд░реВрдмреА -> Node.js рдХреЗ рдкрде рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛, рдореБрдЭреЗ рдмрд╕ JS (ES5) рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЫреБрдЖ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рд╣реИ, рдЬрд╛рджреВ рдХреЛ "рдирд┐рдпрдВрддреНрд░рдХ" рдмрд╛рд░-рдмрд╛рд░ рд▓рд┐рдЦреЗрдВред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдЦрд░рд╛рдм рдХреНрдпреЛрдВ рд╣реИ?
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рдПрдХрдЬреБрдЯ рд╣реИрдВ - рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд╛рд░; рдФрд░ рдХрднреА-рдХрднреА рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рдирд╣реАрдВ, рдмрджрддрд░ред рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдирд┐рд░реНрднрд░рддрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдо (рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдирд╡рд░реНрдЬрди, рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рд╕рдорд╛рдзрд╛рди) рдХреЗ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдердХ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдХрд╣реАрдВ рдмрд╛рд╣рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдЦрд╛рддрд╛ рдмрдирд╛рддреЗ рд╕рдордп, рдореБрдЭреЗ рдПрдХрд╛рдЙрдВрдЯреЗрдВрдЯ рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдиреА рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реЗрд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:
class InvoiceController def initialize(invoice_repository, notification_service) @repository = invoice_repository @notification_service = notification_service end def index @repository.get_all end def show(id) @repository.get_by_id(id) end def create(data) @repository.create(data) @notification_service.notify_accountant end end
рдпрд╣рд╛рдВ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
class ListInvoices def initialize(invoice_repository) @repository = invoice_repository end def call @repository.get_all end end class CreateInvoice def initialize(invoice_repository, notification_service) @repository = invoice_repository @notification_service = notification_service end def call @repository.create(data) @notification_service.notify_accountant end end
рдЦреИрд░, рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдмрдЬрд╛рдп, рдЕрдм рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП "рдлрд╝рдВрдХреНрд╢рди" рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ "рдмрд╛рд╣рд░" рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд░рд╛рдЙрдЯрд░ рдХреА рддрд░рд╣ рдХреБрдЫ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреАрдПрд╕рдПрд▓ (рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛) рдХреЗ рд╕рд╛рде рд▓реБрднрд╛рддрд╛ рд╣реИ, рдореИрдВ рд░реВрдмреА рдореЗрдВ рдЯреНрд░рд┐рдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рд╡рд░реНрдгрди рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛:
`HTTP GET /invoices -> return all invoices` `HTTP POST /invoices -> create new invoice`
рдпрд╛ рдХрдо рд╕реЗ рдХрдо
`HTTP GET /invoices -> ./invoices/list_invoices` `HTTP POST /invoices -> ./invoices/create`
рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ рдореЙрдбрд▓ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо JSON рдХреЛ рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдФрдЪрд┐рддреНрдп рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд░рд╛рдЙрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди
рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ "рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд░рд╛рдЙрдЯрд░" рд▓рд┐рдЦрд╛ рд╣реИред рд░рд╛рдЙрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕реНрддрд░ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЕрдВрджрд░ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдирдХреЗ рдХрд╛рдо рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдкреВрд░реЗ рд░рд╛рдКрдЯрд░ рдХреЛ IoC рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднрд░рд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? "рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдо рддрдХрдиреАрдХ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рд░реНрднрд░рддрд╛ рдЖрд░рдВрднреАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
class Repository; end
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЯреЗрд╕реНрдЯ-рдбреНрд░рд┐рд╡реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд╕реНрддреБ рдХреЗ рдореЙрдбрд▓ рдХреЛ "рд╣реИрдХрд┐рдВрдЧ" рдХрд┐рдП рдмрд┐рдирд╛, рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рд╕реНрдЯрдм рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ DI рдмреЛрдирд╕ рдирд╣реАрдВ рд╣реИ: рдЬрдм рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдмрд╣реБрдд рд╕реБрдЦрдж рдЬрд╛рджреВ рд▓рд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗред рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдирд╡рд░реНрдЬрди рддрдХрдиреАрдХ рдХреЛ рдПрдХ рдкреВрд░реНрдг рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрдХрд░рдг рдЖрдорддреМрд░ рдкрд░ рдПрдХ IoC- (рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрд▓рдЯрд╛) рдХрдВрдЯреЗрдирд░ рд╣реЛрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдФрд░ .NET рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд╛рдВрдд IoC рдХрдВрдЯреЗрдирд░ рдХреЗ рдЯрди рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рджрд░реНрдЬрдиреЛрдВ рд╣реИрдВред рдЬреЗрдПрд╕ рдФрд░ рд░реВрдмреА рдореЗрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдбреНрд░рд╛рдИ-рдХрдВрдЯреЗрдирд░ (
рдбреНрд░рд╛рдИ-рдХрдВрдЯреЗрдирд░ ) рдХреЛ рджреЗрдЦрд╛ред рдпрд╣ рд╡рд╣реА рд╣реЛрдЧрд╛ рдЬреЛ рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧреЗрдЧрд╛:
class Invoice include Import['payment_service'] def pay credit_card = @subscription.customer.credit_card amount = @subscription.plan.price @payment_service.charge(credit_card, amount) end end
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрддрд▓рд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реБрдП рд╡рд░реНрдЧ рдкрд░ рдмреЛрдЭ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбрд▓ рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдЦреИрд░, рдХреБрдЫ, рдФрд░ рдореЙрдбрд▓ рдХреЛ рдЖрдИрдУрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП! рдпрд╣ CreateInvoice рдЬреИрд╕реА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред рджрд┐рдП рдЧрдП рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдИрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реВрдВред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ IoC рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╣реБрдд рдЦреЛрдЬ рдХрд░рдиреЗ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж,
рдореИрдВрдиреЗ рдЕрдкрдиреЗ IoC рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ , рдЬреЛ рдЗрддрдирд╛ рдШреБрд╕рдкреИрда рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдФрд░ рд▓реЛрдб рдХрд░рдирд╛
рджреГрдврд╝рддрд╛ рдЕрдЬреНрдЮрд╛рди рдПрдХ рд╡рд┐рдиреАрдд рд╡рд╕реНрддреБ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рдПрдХ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрдВрдЧреЗред рдСрдмреНрдЬреЗрдХреНрдЯ-рд░рд┐рд▓реЗрд╢рдирд▓ рдХрдирд╡рд░реНрдЯрд░ - ORM (рдСрдмреНрдЬреЗрдХреНрдЯ рд░рд┐рд▓реЗрд╢рдирд▓ рдореИрдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред .NET рдФрд░ рдЬрд╛рд╡рд╛ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА ORM рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдмрд╣реБрддрд╛рдпрдд рд╣реИред рдЙрди рд╕рднреА рдореЗрдВ рдХреБрдЫ рдпрд╛ рдЕрдиреНрдп рдЫреЛрдЯреА рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдирд╕реЗ рдЖрдк рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЗрдПрд╕ рдФрд░ рд░реВрдмреА рдореЗрдВ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ рд╕рднреА, рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рджреГрдврд╝рддрд╛ рд╕реЗ рдореЙрдбрд▓ рдХреЛ рдврд╛рдВрдЪреЗ рдореЗрдВ рдмрд╛рдВрдзрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рджреЗрд╢реА рддрддреНрд╡реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рджреГрдврд╝рддрд╛ рдЕрдЬреНрдЮрд╛рди рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдИрдУрд╕реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рдУрдЖрд░рдПрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдпрд╣ рд░реВрдмреА рдореЗрдВ рдорд╛рдорд▓реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдореИрдВрдиреЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдУрдЖрд░рдПрдо рд╕реАрдХреНрд╡рд▓, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдмрдВрдзрдкрд░рдХ рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреАрдд рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (рд╣реИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕) рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдирд┐рдпрдорд┐рдд рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рд░реБрдЪрд┐ рдереАред рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдореИрдкрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рджреГрдврд╝рддрд╛ рдЕрдЬреНрдЮрд╛рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдореИрдкрд┐рдВрдЧ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдбреЛрдореЗрди рдореЙрдбрд▓ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдореИрдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдк рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ:
entity Invoice do field :amount field :date field :start_date field :end_date field :created_at field :updated_at reference :user, type: User reference :subscription, type: Subscription end
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рд╣рд░реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрдврд╝рддрд╛ рдЕрдЬреНрдЮрд╛рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
repository.save(user)
рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдФрд░ рдпреВрдирд┐рдЯ рдСрдл рд╡рд░реНрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рддреНрд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рд╕рддреНрд░ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдореЙрдбрд▓ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдПрдХрд▓ рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИрдВред рдПрдХ рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди, рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рддреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореЙрдбрд▓ рдХреЗ рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг рдХреА рдЗрдХрд╛рдИ:
user = session.load(User, id: 1) plan = session.load(Plan, id: 1) subscription = Subscription.new(user, plan) session.attach(subscription) invoice = Invoice.new(subscription) session.attach(invoice)
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, 4 рдХреЗ рдмрдЬрд╛рдп 2 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рд▓реЗрдирджреЗрди рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдлрд┐рд░ рдЕрдЪрд╛рдирдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдпрд╛рдж рд░рдЦрдирд╛! рдпрд╣рд╛рдБ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЬрд╛ рд╡реБ рдХреА рднрд╛рд╡рдирд╛ рд╣реИ: рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдПрдХ рд╣реА рдЕрд▓реНрдкрд╡рд┐рдХрд╕рд┐рдд рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИ? рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ - рд╣рд╛рдВ, рдпрд╣ рд╣реИред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдХреА рдкрд░рдд рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрдВрдбрд╛рд░рдг рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдХреЛрдб рдореЗрдВ рд╕реАрдзреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд╢реНрдЪрди рд▓рд┐рдЦрдирд╛ред рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рдирд┐рд░реНрдгрдп рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕ рдХреНрд╖рдг рддрдХ рд╡рд╛рдкрд╕ рдЬрдм рд╣рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЧрдпрд╛ред рдУрдУрдкреА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ - рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╣реА рд╕реЗрдЯ, рди рдХреЗрд╡рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред рднрдВрдбрд╛рд░ рдХреЛ рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рднреА рд╕рдВрдХреЗрддреЛрдВ рд╕реЗ, рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдВрдЧреА рдЬреЛ рд╣рдордиреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА рдереАрдВред рдпрд╣реА рд╣реИ, рд╣рдо рдПрдХрд▓ рдПрдХреАрдХреГрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
class LoadPlan def initialize(session) @session = session end def call sql = <<~SQL SELECT p.* AS ENTITY plan FROM plans p WHERE p.id = 1 SQL @session.fetch(Plan, sql) end end
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп SQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реНрд╡рд╛рдж рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдореИрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреАрдПрд╕рдПрд▓ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдПрд╕рдХреНрдпреВрдПрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд▓рд╛рди.рд▓реЛрдб (рдЖрдИрдбреА) рд▓рд┐рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддреБрдЪреНрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рдЬрдм рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдПрд╕рдХреНрдпреВрдПрд▓ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдЙрдкрдХрд░рдг рдмрди рдЬрд╛рддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдЖрдк рдЗрд╕реЗ рд╢реБрджреНрдз SQL рдХреА рддрд░рд╣ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдПрдХ рдФрд░ ORM рдХреЛ рд╢рд╛рдк рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ "рдореИрдВ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред" рдЬреЛ рд▓реЛрдЧ рд╕рдВрджреЗрд╣ рдореЗрдВ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ
рдореЛрдВрдЧреЛрдбреАрдмреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЗрдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдПрд╕рдХреНрдпреВрдПрд▓-рдЬреИрд╕реЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рд╣реА рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд▓рдЧрддрд╛ рд╣реИ! рдЗрд╕рд▓рд┐рдП,
рдУрдЖрд░рдПрдо рдЬреЗрдЯрд╕реЗрдЯ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬреЛ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛, рдПрд╕рдХреНрдпреВрдПрд▓ рдиреНрдпреВрдирддрдо рд╕рдВрд╕реЗрдЪрди рдЬреИрд╕реЗ "рдПрдПрд╕ рдИрдПрдирдЯреАрд┐рдЯреА" рдХреЗ рд╕рд╛рде рд╣реИред рд╡реИрд╕реЗ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рд╕рд╛рд░рдгреАрдмрджреНрдз рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рд╡рд┐рднрд┐рдиреНрди рдбреАрдЯреАрдУ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ - рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ SQL рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рд╣реИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рдХреБрдЫ рд▓реЛрдЧ рдПрдХ рдореЙрдбрд▓ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рдХреЛ "рд╕реНрдХреНрд░реЙрд▓" рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдлреНрд▓реИрдЯ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди (рджреГрд╢реНрдп) рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдкрд░рд┐рдкрдХреНрд╡ рдЙрддреНрдкрд╛рдж рдЕрдиреБрдХреВрд▓рди рдЪрд░рдг рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬрдм CQRS (рдХрдорд╛рдВрдб рдФрд░ рдХреНрд╡реЗрд░реА рд░рд┐рд╕реНрдкрд╛рдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рд╕реЗрдЧреНрд░реАрдЧреЗрд╢рди) рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:
- рд╣рдордиреЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рд▓реЛрдб рдФрд░ рд╕рд╣реЗрдЬрдирд╛ рд╣реИ, рд╣рдордиреЗ рдореЙрдбрд▓ рдХреЗ рд╡реЗрдм рдбрд┐рд▓реАрд╡рд░реА рдЯреВрд▓, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рдЙрдЯрд░ рдХреЗ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рднреА рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИ;
- рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╕рднреА рддрд░реНрдХ рдЬреЛ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдмрдЬрд╛рдп рдХреНрд░рд┐рдпрд╛рдУрдВ (рдХреНрд░рд┐рдпрд╛рдУрдВ) рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
- рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
- рд╕рднреНрдп рдЙрдкрдХрд░рдг рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рд╛рдЧреВ;
- рдЖрд╡рд╢реНрдпрдХ рдУрдЖрд░рдПрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ "рд░рд╛рдЙрдЯрд░" рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдХрд╛рд░реНрдп рд╕реНрд╡рд╛рдпрддреНрдд рд╣реИрдВ рдФрд░ рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдирд┐рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП,
рдбреИрдВрдбреА рдврд╛рдВрдЪреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ
, рдореИрдВрдиреЗ рдПрдХ рд░рд╛рдЙрдЯрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдг (/ рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ):
:receive .-> :before -> common/open_db_session GET -> welcome -> :respond <- show_welcome /auth -> :before -> current_user@users/load_current_user /profile -> GET -> plan@plans/load_plan \ -> :respond <- users/show_user_profile PATCH -> users/update_profile /plans -> GET -> current_plan@plans/load_current_plan \ -> plans@plans/load_plans \ -> :respond <- plans/list :catch -> common/handle_errors
"GET / рдУрдЯ / рдпреЛрдЬрдирд╛рдПрдБ" рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреЛ "рд╣рд╛рдЗрд▓рд╛рдЗрдЯ" рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
- ", рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ -> рд╕рд╛рдорд╛рдиреНрдп / рдЦреБрд▓реЗ_рдбреАрдмреА_ рд╕рддреНрд░" - рдЬреЗрдЯрд╕реЗрдЯ рд╕рддреНрд░ рдЦреЛрд▓рдирд╛
- / рд╕рд╛рдорд╛рдиреНрдп ": рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ -> current_user @ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / load_current_user" - рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЯреЛрдХрди рджреНрд╡рд╛рд░рд╛) рд▓реЛрдб рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдо IoC рдХрдВрдЯреЗрдирд░ рдореЗрдВ current_user (current_user @ рдЕрдиреБрджреЗрд╢) рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- / рдпреЛрдЬрдирд╛ / рдпреЛрдЬрдирд╛ "current_plan @ рдпреЛрдЬрдирд╛рдПрдБ / load_current_plan" - рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рд▓реЛрдб рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рд╕реЗ @current_user рдХрд╛ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо IoC рдХрдВрдЯреЗрдирд░ рдореЗрдВ current_plan (current_plan @ рдЕрдиреБрджреЗрд╢) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
class LoadCurrentPlan def initialize(current_user, session) @current_user = current_user @session = session end def call sql = <<~SQL SELECT p.* AS ENTITY plan FROM plans p INNER JOIN subscriptions s ON s.user_id = :user_id AND s.current = 't' WHERE p.id = :user_id LIMIT 1 SQL @session.execute(sql, user_id: @current_user.id) do |row| map(Plan, row, 'plan') end end end
- "рдпреЛрдЬрдирд╛рдПрдВ @ рдпреЛрдЬрдирд╛рдПрдВ / load_plans" - рд╕рднреА рдЙрдкрд▓рдмреНрдз рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рд▓реЛрдб рдХрд░рдирд╛ред рдкрд░рд┐рдгрд╛рдо IoC рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдпреЛрдЬрдирд╛рдУрдВ (рдпреЛрдЬрдирд╛рдУрдВ @ рдирд┐рд░реНрджреЗрд╢) рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИред
- ": рдЙрддреНрддрд░ <- рдпреЛрдЬрдирд╛рдПрдВ / рд╕реВрдЪреА" - рдкрдВрдЬреАрдХреГрдд рд╡реНрдпреВрдмрд░реНрд╕реНрдЯ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП JBuilder, рдкреНрд░рдХрд╛рд░ рдХреА 'рдпреЛрдЬрдирд╛ / рд╕реВрдЪреА' рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
json.plans @plans do |plan| json.id plan.id json.name plan.name json.price plan.price json.active plan.id == @current_plan.id end
@Plans рдФрд░ @current_plan рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдорд╛рди рдХрдВрдЯреЗрдирд░ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХреНрд╢рди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╕рдм рдХреБрдЫ "рдСрд░реНрдбрд░" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ "рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдореЛрдб рдореЗрдВ рдРрд╕реЗ рдЪрд░ рдХрд╛ рдЕрд▓рдЧрд╛рд╡ рд╣реИ? рд╣рд╛рдБ, рдпрд╣ рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рд╛рдЗрдкреЛ рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред рдмрд╛рдВрдХрд╛ рдХреЗ рднреАрддрд░, @plans, @current_plan, @current_user рдЬреИрд╕реЗ рдЪрд░ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдмрдВрдзреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреНрд╖рдг рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реИрд╕реЗ, рдЬреЗрдЯрд╕реЗрдЯ рд╕рддреНрд░ рднреА рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ - рдбреЗрдВрдбреА рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХреЗ рд░рд╛рдЬреНрдп рдХрд╛ рдПрдХ рд░реАрд╕реЗрдЯ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЕрдкрдирд╛ рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рд╣реИред рд╣рд╛рдЗрдкреЛ, рдбреИрдВрдбреА рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдкрд░ рд╢рд╛рд╕рди рдХрд░рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдпрд╣ рд╡рд╛рдХреНрдп рдирд╛рдореЛрдВ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдХрд┐рддрдирд╛ рдордЬреЗрджрд╛рд░ рд░рд╣рд╛ рд╣реЛред
рдирд┐рд╖реНрдХрд░реНрд╖
рджрд┐рдП рдЧрдП рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдореИрдВ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ; рдореИрдВ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдЬреИрд╕реА рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ; рдореИрдВ рднреА рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдпреЗ рд╕рднреА рдЕрдзрд┐рдирд┐рдпрдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕реНрддрд░ рдкрд░ рдЬрдВрдЬреАрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдмреИрдХреЗрдВрдб рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде, рдЬрдм рдЖрдк рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдбреАрдПрд╕рдПрд▓ рд░рд╛рдЙрдЯрд░ рдбрдВрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╣рдо рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдмреИрдХрдПрдВрдб рдмрдирд╛рдиреЗ рдХреЗ рдореВрд▓рднреВрдд рдкрд╣рд▓реБрдУрдВ рдкрд░ рдПрдХ рддрд░рд╣ рдХрд╛ рднреНрд░рдордг рдХрд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВред рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдЦ рд╕рддрд╣реА рд╣реИ, рдпрд╣ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ, рдЬреИрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдкрд░ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рднреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЦрд╛рд▓реА рд╕реЗ рдЦрд╛рд▓реА рдирд╣реАрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рд╣реИ SOLID, TDD, MVC рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рджрд┐рдЦрддреА рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдкрд╛рдардХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд рдЗрди рдФрд░ рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХреА рд╕рдЦреНрдд рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╡рд┐рд╢рд╛рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рджреБрдХрд╛рди рдореЗрдВ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрддрд┐рдпрд╛рдБ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рднрд╛рд╖рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ, рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдерд╛ред
рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╡реИрдзрддрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИ, рдЙрдирдХрд╛ рд╕рд╛рд░ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рд░реБрдЪрд┐ рдХрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦреВрдВрдЧрд╛ред