Heimdallr: рдореЙрдбрд▓ рдХреНрд╖реЗрддреНрд░ рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдирдпрд╛ CanCan

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

рдереЛрдбрд╝реА рд╣рддрд╛рд╢рд╛ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рджреЛ рдкреНрдпрд╛рд░реЗ рд░рддреНрди рд▓рд┐рдЦреЗред рд╣реЗрдорджрд╛рд▓реНрд░ (рд╣реЗрдорджрд▓) рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЗрдорджрд╛рд▓реНрд░ рд╕реЗ рдорд┐рд▓реЛ :: рд╕рдВрд╕рд╛рдзрди ред рд╡реЗ рдЖрдкрдХреЗ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╢рд╛рдВрддрд┐ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд▓рд╛рдПрдВрдЧреЗред

Heimdallr


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



рдХрдИ рд░реАрд╕реНрдЯрдлреБрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, 1 рдФрд░ 2 рдХрд╛ рд╕реНрддрд░ рд╕рдорд╛рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

  1. рдореЙрдбрд▓ рдПрдХреНрд╕реЗрд╕
  2. рдореЙрдбрд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ

рдЗрд╕реА рд╕рдордп, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдорд╣рддреНрд╡ рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Github рдмрджрдирд╛рдо рдЙрджрд╛рд╣рд░рдг рдлреАрд▓реНрдбреНрд╕ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рдЙрджрд╛рд╣рд░рдг рд╣реИ? рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдХрд┐рд╕реЗ рд╣реИ! тАЭ

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣реЗрдорджрд╛рд▓реНрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

class Article < ActiveRecord::Base include Heimdallr::Model belongs_to :owner, :class_name => 'User' restrict do |user, record| if user.admin? #      scope :fetch scope :delete can [:view, :create, :update] else #      -  scope :fetch, -> { where('owner_id = ? or secrecy_level < ?', user.id, 5) } scope :delete, -> { where('owner_id = ?', user.id) } # ...        # (    )... if record.try(:owner) == user can :view can :update, { secrecy_level: { inclusion: { in: 0..4 } } } else can :view cannot :view, [:secrecy_level] end # ...      ,   . can :create, %w(content) can :create, { owner_id: user.id, secrecy_level: { inclusion: { in: 0..4 } } } end end end 

рдореЙрдбрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреАрдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕реНрд╡рдпрдВ рдФрд░ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред 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 # => nil 

рд▓рдЧрднрдЧред рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ Canan рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдХреИрдирдХреИрди


рдХрдИ рд░реЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, "рд╕реБрд░рдХреНрд╖рд╛" рд╢рдмреНрдж рдХрдирдХ рдордгрд┐ рдХрд╛ рдПрдХ рдкрд░реНрдпрд╛рдп рд╣реИред рдХреИрдирдХрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдпреБрдЧ рдерд╛ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:


рд╣рдордиреЗ рд╣реЗрдордбрд╛рд▓реНрд░ рдХреЛ рдПрдХ рдореЙрдбрд▓ рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд▓рд┐рдпрд╛ рдФрд░ рд▓рд┐рдЦрд╛ рд╣реЗрдорджрд▓реНрд▓рд░ :: рд╕рдВрд╕рд╛рдзрдиред

рд╣реЗрдордбрд╛рд▓реНрд░ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдХреИрдирдХрди рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди load_and_authorize рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 class ArticlesController < ApplicationController include Heimdallr::Resource load_and_authorize_resource #    : # # load_and_authorize_resource :resource => :article #  : # # routes.rb: # resources :categories do # resources :articles # end # # load_and_authorize_resource :through => :category def index # @articles   restrict' end def create # @article   restrict' end end 

рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рддрд╛


рдХрд╣рд╛рдиреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдЬрдбрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди REST-APIред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдХрд┐рди рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рд╕рдорд╛рдкрди рдХрд┐рдпрд╛ред

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ CRUD рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ JS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ / рдмрдирд╛рдиреЗ / рдЕрджреНрдпрддрди / рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде REST рд╣реИред рдкрд╣реБрдБрдЪ рдЕрдзрд┐рдХрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╢реНрди рдкреВрдЫрддреЗ рд╣реИрдВ:

  1. рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЭреЗ рдХреМрди рд╕реА рдЗрдХрд╛рдЗрдпрд╛рдБ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ?
  2. рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ?
  3. рдореИрдВ рдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВ?
  4. рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ?
  5. рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
  6. рдмрдирд╛рддреЗ рд╕рдордп рдореИрдВ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ / рд╕рдХрддреА рд╣реВрдВ?

рдкрд╣рд▓рд╛ рдкреНрд░рд╢реНрди рд╣реЗрдорджрд▓реНрд▓рд░ рдиреЗ рд╕реНрд╡рднрд╛рд╡ рд╕реЗ рддрдп рдХрд┐рдпрд╛ рд╣реИред рдЖрдкрдиреЗ рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рдЧреБрдВрдЬрд╛рдЗрд╢ рдФрд░ рд╕рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред рдмрд╛рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЕрдкрдиреЗ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдХрд┐ рд╣рдо 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 рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рджреВ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, рдЦреЛрдореЗрдХреЛрд╡ рдЖрдкрдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ!

р▓а_р▓а

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


All Articles