Bei der vorherigen Implementierung kann nur das Poster den Beitrag bearbeiten oder löschen. Ich werde es jedoch erweitern, damit jeder Beiträge bearbeiten / löschen kann, wenn er als Administrator angemeldet ist.
Fügen Sie dazu Ihrem Benutzermodell eine Admin-Spalte hinzu.
$ rails g migration AddAdminToUsers admin:boolean
db/migrate/xxxxxxxxxxxxxx_add_admin_to_users.rb
# frozen_string_literal: true
class AddAdminToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :admin, :boolean, default: false, null: false
end
end
Übrigens habe ich den Test bis jetzt nach der Implementierung der Funktion geschrieben, aber ich denke, dass ich das grundlegende Verhalten von pundit verstehe, also werde ich es zuerst aus dem Test schreiben.
Da der Test, der nicht bearbeitet und gelöscht werden kann, wenn Sie als anderer Benutzer ohne Administratorrechte angemeldet sind, bereits geschrieben wurde,
Lassen Sie uns implementieren. Genau genommen ist es perfekt, sowohl den Richtlinientest als auch den Anforderungstest zu implementieren, aber hier werden wir nur die Richtlinie implementieren.
Wenn Sie möchten, schauen Sie sich nicht das hier geschriebene Beispiel an. Wenn Sie jedoch versuchen, es selbst zu implementieren und zu vergleichen, ist es üblich, Code zu schreiben. Versuchen Sie es also bitte.
spec/policies/post_policy_spec.rb
...
RSpec.describe PostPolicy, type: :policy do
let(:user) { create(:user) }
+ let(:admin_user) { create(:user, admin: true) }
let(:post) { create(:post) }
...
it "Nicht erlaubt, wenn angemeldet, aber ein anderer Benutzer" do
expect(subject).not_to permit(user, post)
end
+ it "Erlaubt, wenn Sie als Administrator angemeldet sind" do
+ expect(subject).to permit(admin_user, post)
+ end
...
spec/factories/posts.rb
...
remember_created_at { nil }
name { "MyString" }
tokens { nil }
+ admin { false }
end
...
Verschieben Sie nach der bisherigen Implementierung rubocop und rspec und überprüfen Sie. Ich habe die Richtliniendatei noch nicht implementiert, daher ist der Test Moos.
Erstellen Sie zunächst in application_policy.rb eine private Methode, die feststellt, dass Sie Administrator sind.
app/policies/application_policy.rb
...
private
def mine?
@record.user == @user
end
+
+ def admin?
+ @user.present? && @user.admin?
+ end
+
Alles, was übrig bleibt, ist, die beiden Beurteilungen von update? Destroy? In post_policy.rb zu ändern.
app/policies/post_policy.rb
def update?
- mine?
+ mine? || admin?
end
def destroy?
- mine?
+ mine? || admin?
end
Das ist es!
Dies ist ein kleiner, dünner Artikel. Berühren Sie also factoryBot, um das Erstellen von Administratorbenutzern zu vereinfachen.
spec/factories/users.rb
name { "MyString" }
tokens { nil }
admin { false }
+
+ trait :admin do
+ admin { true }
+ end
end
spec/policies/post_policy_spec.rb
RSpec.describe PostPolicy, type: :policy do
let(:user) { create(:user) }
- let(:admin_user) { create(:user, admin: true) }
+ let(:admin_user) { create(:user, :admin) }
let(:post) { create(:post) }
Wie wäre es damit, rspec damit zu betreiben? Wenn Sie fehlerfrei schreiben können, sollten Sie den Test bestehen.
Wie Sie sehen können, kann das Merkmal verwendet werden, indem es als Alias an das zweite Argument übergeben wird, z. B. "create" von factoryBot. Es gibt wenig Nutzen und Sinnlosigkeit, wenn Sie nur das Admin-Flag setzen. Wenn es jedoch eine Spalte gibt, für die im Fall eines Admin-Benutzers ein Anfangswert als Satz festgelegt werden soll, werden bei jedem Erstellen mehrere Spalten hinzugefügt Sie müssen den Anfangswert nicht festlegen.
Bitte verwenden Sie alle Mittel.
→ Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 18 ・ Implementierung des Endbenutzer-Controllers [Zur Serialisierungstabelle]
Recommended Posts