<%= link_to 'Pundit Blog', root_path, class: 'navbar-brand' %>
- <% link_to 'Home', root_path %>
<% if user_signed_in? %> - <%= current_user.email %>
- <%= link_to 'Log out', destroy_user_session_path, method: :delete %>
<% else %> - <%= link_to 'Log In', new_user_session_path %>
- <%= link_to 'Sign Up', new_user_registration_path %>
<% end %>
Pentru ca navigația să fie utilizată, trebuie să o redați în aspectul aplicației. Ajustați aspectul aplicației dvs. pentru a arăta cum am spus mai jos.
# App / opinii / machete / application.html.erb Pundit-blog <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <%= render "layouts/navigation" %> <% flash.each do |key, value| %>
<%= value %>
<% end %>
<%= yield %>
Generați modelul de utilizator
Rulați comanda pentru a instala Devise.
șinele generează:
Acum, generați modelul de utilizator.
șinele generează un utilizator
Migrează baza de date.
rake db: migrați
Generați resursele articolului
Rulați comanda pentru a genera resursele articolului.
șinele generează schele Titluri articole: corpul șirului: text
Aceasta vă va genera ArticlesController
și modelul articolului. De asemenea, va genera viziunile necesare.
Acum migrați baza de date rulând:
rake db: migrați
Deschide app / opinii / articole / _form.html.erb
și să o arate ca la ce am mai jos.
# App / opinii / articole / _form.html.erb <%= form_for(article) do |f| %> <% if article.errors.any? %> <%= pluralize(article.errors.count, "error") %> a interzis salvarea acestui articol:
<% article.errors.full_messages.each do |message| %> - <%= message %>
<% end %>
<% end %> <%= f.label :title %> <%= f.text_field :title %>
<%= f.label :body %> <%= f.text_area :body %>
<%= f.submit %>
<% end %>
Pentru tine fișier index, ar trebui să arate așa.
# App / opinii / articole / index.html.erb
Titlu | Corp | |
<% @articles.each do |article| %> <%= article.title %> | <%= article.body %> | <%= link_to 'Show', article %> | <%= link_to 'Edit', edit_article_path(article) %> | <%= link_to 'Destroy', article, method: :delete, data: confirm: 'Are you sure?' %> |
<% end %>
<%= link_to 'New article', new_article_path %>
Codul de mai sus aranjează articolele de pe pagina de index într-un format de tabel pentru a face să pară prezentabil.
Deschideți fișierul rutelor și adăugați ruta pentru resursele articolelor.
# config / routes.rb ... resurse: articole rădăcină la: "articole # index"
Integrați Pundit
Adăugați bijuteria Pundit în fișierul Gem.
# Gemfile ... bijuterie "pundit"
Rulați comanda pentru a instala.
instalare pachet
Integrați Pundit în aplicația dvs. adăugând următoarea linie la dvs. ApplicationController.
# app / controllers / application_controller.rb ... include Pundit ...
Pornește generatorul lui Pundit.
rails g pundit: instalare
Acest lucru va genera un dosar de aplicații / politici care conține o clasă de bază cu politici. Fiecare politică este o clasă Ruby de bază.
Acesta este modul în care arată politica clasei de bază.
# app / policies / application_policy.rb clasă ApplicationPolicy attr_reader: utilizator,: record def initialize (utilizator, înregistrare) @user = user @record = înregistrare fin index def? sfarsit def defal? scope.where (: id => record.id) .există? sfarsit def crea? sfarsit nou def? crea? end update update? Definiții false fin def? Actualizați? end def distruge? (user, scope.class) domeniul de clasă Domeniul de aplicare attr_reader: user,: scope def initialize (utilizator, domeniul de aplicare) @user = user @scope = domeniul de aplicare final def rezolva sfârsitul scopului end end
Creați politica de articole
Acum trebuie să vă scrieți propria politică. Pentru acest tutorial, doriți să permiteți numai utilizatorilor înregistrați să creeze articole noi. În plus, numai creatorii unui articol ar trebui să poată edita și șterge articolul.
Pentru a realiza acest lucru, politica dvs. privind articolele va arăta astfel.
# app / policies / article_policy.rb clasă ArticlePolicy < ApplicationPolicy def index? true end def create? user.present? end def update? return true if user.present? && user == article.user end def destroy? return true if user.present? && user == article.user end private def article record end end
În cele de mai sus, permiteți tuturor (utilizatorii înregistrați și neînregistrați) să vadă pagina index. Pentru a crea un articol nou, trebuie înregistrat un utilizator. Să utilizați user.present?
pentru a afla dacă utilizatorul care încearcă să efectueze acțiunea este înregistrat.
Pentru actualizarea și ștergerea, doriți să vă asigurați că numai utilizatorul care a creat articolul este capabil să efectueze aceste acțiuni.
În acest moment, trebuie să stabiliți o relație între modelul dvs. de articol și cel al utilizatorului.
Faceți acest lucru generând o nouă migrare.
șinele generează migrarea add_user_id_to_articles utilizator: referințe
Apoi, migrați baza de date prin executarea comenzii:
rake db: migrați
Deschideți modelul Utilizator și adăugați linia care sigilează relația.
# app / models / user.rb ... has_many: articole
Modelul dvs. de articol ar trebui să aibă acest lucru.
# app / models / article.rb ... belongs_to: utilizator
Acum trebuie să vă actualizați ArticlesController
așa că este în concordanță cu ceea ce ați făcut până acum.
# app / controllers / articles_controller.rb clasă ArticlesController < ApplicationController before_action :set_article, only: [:show, :edit, :update, :destroy] # GET /articles # GET /articles.json def index @articles = Article.all authorize @articles end # GET /articles/1 # GET /articles/1.json def show end # GET /articles/new def new @article = Article.new authorize @article end # GET /articles/1/edit def edit end # POST /articles # POST /articles.json def create @article = Article.new(article_params) @article.user = current_user authorize @article respond_to do |format| if @article.save format.html redirect_to @article, notice: 'Article was successfully created.' format.json render :show, status: :created, location: @article else format.html render :new format.json render json: @article.errors, status: :unprocessable_entity end end end # PATCH/PUT /articles/1 # PATCH/PUT /articles/1.json def update respond_to do |format| if @article.update(article_params) format.html redirect_to @article, notice: 'Article was successfully updated.' format.json render :show, status: :ok, location: @article else format.html render :edit format.json render json: @article.errors, status: :unprocessable_entity end end end # DELETE /articles/1 # DELETE /articles/1.json def destroy @article.destroy respond_to do |format| format.html redirect_to articles_url, notice: 'Article was successfully destroyed.' format.json head :no_content end end private # Use callbacks to share common setup or constraints between actions. def set_article @article = Article.find(params[:id]) authorize @article end # Never trust parameters from the scary internet, only allow the white list through. def article_params params.require(:article).permit(:title, :body, :user_id) end end
În acest moment în aplicația dvs., ați implementat cu succes politicile care restricționează anumite părți ale aplicației dvs. utilizatorilor selectați.
Doriți să adăugați un mesaj de eroare standard care apare ori de câte ori un utilizator neautorizat încearcă să acceseze o pagină restricționată. Pentru a face acest lucru, adăugați următoarele la dvs. ApplicationController
.
# app / controllers / application_controller.rb ... rescue_from Pundit :: NotAuthorizedError, cu:: user_not_autorizat privat def user_not_authorized flash [: warning] = "Nu sunteți autorizat să efectuați această acțiune". redirect_to (request.referrer || root_path) sfârșit
Acest cod transformă pur și simplu un text de bază care spune că utilizatorul nu este autorizat să efectueze acțiunea.
Alerga:
$ server de șine
Pentru a porni serverul Rails, îndreptați-vă browserul http: // localhost: 3000
pentru a vedea ce ai.
Concluzie
În acest tutorial, ați învățat cum să lucrați cu Devise și Pundit. Ați putut să creați politici care permit numai utilizatorilor autorizați să vizualizeze anumite părți ale aplicației. Ați creat, de asemenea, un text de eroare de bază care arată când un utilizator neautorizat încearcă să acceseze o parte restricționată a aplicației.
Puteți afla mai multe despre Pundit verificând pagina GitHub.