рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм-рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдХрдИ рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВред рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХреА рдУрд░ рд▓реЗ рдЧрдП: ActiveRecord (
Egor , hello!!) рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реНрддрд░ рдкрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреИрдирдХрди рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрддрд░ рд╣реИред
рдереЛрдбрд╝реА рд╣рддрд╛рд╢рд╛ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рджреЛ рдкреНрдпрд╛рд░реЗ рд░рддреНрди рд▓рд┐рдЦреЗред
рд╣реЗрдорджрд╛рд▓реНрд░ (рд╣реЗрдорджрд▓) рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░
рд╣реЗрдорджрд╛рд▓реНрд░ рд╕реЗ рдорд┐рд▓реЛ
:: рд╕рдВрд╕рд╛рдзрди ред рд╡реЗ рдЖрдкрдХреЗ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╢рд╛рдВрддрд┐ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд▓рд╛рдПрдВрдЧреЗред
Heimdallr
рдЖрдЗрдП рдкрд╣рд▓реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦреЗрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ REST рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╕рдорд╛рди рдХрд░рддрд╛ рд╣реИред рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЕрдХреНрд╕рд░ рдореЙрдбрд▓ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рддреА рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рди рд╣реЛред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд╕рд╣рдиреАрдп рд░реВрдк рд╕реЗ рдмрдбрд╝реА рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдХрднреА-рдХрднреА рд╡реЗ рдПрдХреНрд╕реЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдХрдИ рд░реАрд╕реНрдЯрдлреБрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, 1 рдФрд░ 2 рдХрд╛ рд╕реНрддрд░ рд╕рдорд╛рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:
- рдореЙрдбрд▓ рдПрдХреНрд╕реЗрд╕
- рдореЙрдбрд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ
рдЗрд╕реА рд╕рдордп, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдорд╣рддреНрд╡ рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Github рдмрджрдирд╛рдо рдЙрджрд╛рд╣рд░рдг рдлреАрд▓реНрдбреНрд╕ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рдЙрджрд╛рд╣рд░рдг рд╣реИ? рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдХрд┐рд╕реЗ рд╣реИ! тАЭ
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣реЗрдорджрд╛рд▓реНрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
class Article < ActiveRecord::Base include Heimdallr::Model belongs_to :owner, :class_name => 'User' restrict do |user, record| if user.admin?
рдореЙрдбрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреАрдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕реНрд╡рдпрдВ рдФрд░ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред Heimdallr рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ
.restrict
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
.restrict
рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдХреЛ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдЖрд╡рд░рдг рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Article.restrict(current_user).where(:typical => true)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
Class.restrict
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреНрд▓реЙрдХ рдХрд╛ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдЬрд╛рдВрдЪреЗрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ
.try(:field)
рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдХрд╣реАрдВ рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░, рдПрдХ рдЕрдкрд╡рд╛рдж рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрдордбрд╛рд▓рд░ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдирд┐рд╣рд┐рдд рджреЛ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣реЗрдордбрд╛рд▓реНрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЙрдбрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ:
article = Article.restrict(current_user).first @article = article.implicit @article.protected_thing
рд▓рдЧрднрдЧред рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ Canan рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
рдХреИрдирдХреИрди
рдХрдИ рд░реЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, "рд╕реБрд░рдХреНрд╖рд╛" рд╢рдмреНрдж рдХрдирдХ рдордгрд┐ рдХрд╛ рдПрдХ рдкрд░реНрдпрд╛рдп рд╣реИред рдХреИрдирдХрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдпреБрдЧ рдерд╛ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
- рдХреИрдирдХрди рдХреА рдХрд▓реНрдкрдирд╛ рдПрдХ рдРрд╕реЗ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЧрдИ рдереА рдЬреЛ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ REST рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЗрд╡рд▓ рдореЙрдбрд▓реЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛рддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рд░рдгрдиреАрддрд┐ рдЕрдЪреНрдЫреА рд╣реЛрддреА рд╣реИ, рдХрднреА-рдХрднреА рдирд╣реАрдВред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЦреЗрддреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ, рдЪрд╛рд╣реЗ рдЖрдк рдХрд┐рддрдиреА рднреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд▓реЗрдВред Canan рдмрд╕ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдФрд░ рдЦреЗрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ред
- рд╢рд╛рдЦрд╛ 1.x рдореГрдд рд╣реИ рдФрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдХрдИ рдЕрдкреНрд░рд┐рдп рдХреАрдбрд╝реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдирд╛рдордкреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред рдПрдХ рд╢рд╛рдЦрд╛ 2.x рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд▓рдВрдмреА рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИред
рд╣рдордиреЗ рд╣реЗрдордбрд╛рд▓реНрд░ рдХреЛ рдПрдХ рдореЙрдбрд▓ рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд▓рд┐рдпрд╛ рдФрд░ рд▓рд┐рдЦрд╛ рд╣реЗрдорджрд▓реНрд▓рд░ :: рд╕рдВрд╕рд╛рдзрдиред
рд╣реЗрдордбрд╛рд▓реНрд░ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдХреИрдирдХрди рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди
load_and_authorize
рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
- рдпрджрд┐ рд╕реНрдХреЛрдк: рдХреНрд░рд┐рдПрдЯ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрдХрд╛рдЗрдпрд╛рдБ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ), рддреЛ рдЖрдк рдирдП рдФрд░ рдмрдирд╛ рдирд╣реАрдВ рд╕рдХрддреЗ
- рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдХреЛрдк рдирд╣реАрдВ рд╣реИ: рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдЖрдк рдПрдбрд┐рдЯ рдФрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
- рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг: рдирд╖реНрдЯ
- рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ, рдЖрдкрдХреЛ рддреБрд░рдВрдд рд╕рдВрд░рдХреНрд╖рд┐рдд рдЗрдХрд╛рдИ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ
restrict
рдХреЙрд▓ рдХрд░рдирд╛ рдирд╣реАрдВ рднреВрд▓ restrict
рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class ArticlesController < ApplicationController include Heimdallr::Resource load_and_authorize_resource
рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рддрд╛
рдХрд╣рд╛рдиреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдЬрдбрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди REST-APIред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдХрд┐рди рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рд╕рдорд╛рдкрди рдХрд┐рдпрд╛ред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ CRUD рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ JS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ / рдмрдирд╛рдиреЗ / рдЕрджреНрдпрддрди / рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде REST рд╣реИред рдкрд╣реБрдБрдЪ рдЕрдзрд┐рдХрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдкреВрдЫрддреЗ рд╣реИрдВ:
- рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЭреЗ рдХреМрди рд╕реА рдЗрдХрд╛рдЗрдпрд╛рдБ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ?
- рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ?
- рдореИрдВ рдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВ?
- рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ?
- рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
- рдмрдирд╛рддреЗ рд╕рдордп рдореИрдВ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ / рд╕рдХрддреА рд╣реВрдВ?
рдкрд╣рд▓рд╛ рдкреНрд░рд╢реНрди рд╣реЗрдорджрд▓реНрд▓рд░ рдиреЗ рд╕реНрд╡рднрд╛рд╡ рд╕реЗ рддрдп рдХрд┐рдпрд╛ рд╣реИред рдЖрдкрдиреЗ рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рдЧреБрдВрдЬрд╛рдЗрд╢ рдФрд░ рд╕рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред рдмрд╛рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЕрдкрдиреЗ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдХрд┐ рд╣рдо RSON рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП JSON рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреИрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╣реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
{modifiable: self.modifiable?, destroyable: self.destroyable?}
рдХреНрдпрд╛ рдореИрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ? рдФрд░ рдХрд┐рди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде?
REST API рдХреЗ рд▓рд┐рдП, рдирдпрд╛ рддрд░реАрдХрд╛ рд▓рдЧрднрдЧ рдмреЗрдХрд╛рд░ рд╣реИред рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЬрдЧрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
Article.restrictions(current_user).allowed_fields[:create]
рдпрджрд┐ рд╣рдо рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ Heimdallr :: рд╕рдВрд╕рд╛рдзрди рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрддреНрддрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рджреЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдлрд╝реАрд▓реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред
.creatable?
рднреА рдПрдХ
.creatable?
рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛
.creatable?
, рддрд╛рдХрд┐ рдЗрд╕реЗ REST рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХреЗред
рдХреНрдпрд╛ рдореИрдВ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рд╡рд┐рдЪрд╛рд░ рд╕реГрд╖реНрдЯрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИред рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░ рд╣рдо рд╕рдВрдкрд╛рджрди рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ:
Article.restrictions(current_user).allowed_fields[:update]
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
Heimdall рдФрд░ рдЗрд╕рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, Heimdallr :: рд╕рдВрд╕рд╛рдзрди, рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрдЪрд░рд╛ рдХреЗ рдмрд┐рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ REST-API рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рджреВ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ,
рдЦреЛрдореЗрдХреЛрд╡ рдЖрдкрдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ!
р▓а_р▓а