У меня проблема с политикой. Когда пользователь создает тему, они должны иметь возможность видеть кнопки редактирования и удаления для этой темы, однако эти кнопки не отображаются. Но, если роль пользователя определяется как admin, тогда они могут фактически видеть кнопки редактирования и удаления тем.Rails Policies (Pundit) Ссылки отображаются только в том случае, если user.admin?
Надеясь получить некоторое представление об этом:
application_policy.rb:
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
false
end
def show?
scope.where(:id => record.id).exists?
end
def create?
user.present?
end
def new?
create?
end
def update?
user.present? && (record.user == user || user.admin?)
end
def edit?
update?
end
def destroy?
update?
end
def scope
record.class
end
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope
end
end
end
topic_policy.rb:
class TopicPolicy < ApplicationPolicy
def index?
true
end
end
user.rb (модель):
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
mount_uploader :avatar, AvatarUploader
has_many :topics, dependent: :destroy
has_many :bookmarks, dependent: :destroy
has_many :likes, dependent: :destroy
validates :name, presence: true
def admin?
role == 'admin'
end
def moderator?
role == 'moderator'
end
def member?
role == 'member'
end
def liked(bookmark)
likes.where(bookmark_id: bookmark.id).first
end
end
Наконец здесь кусок зрения шоу, которое содержит кнопки:
<div class="row landing-top">
<h1 class="lato-dark text-center"><%= topic_hash %></h1>
<div class="col-md-2 text-center">
<%= link_to topics_path, class: 'btn btn-default btn-sm' do %>
<span class="glyphicon glyphicon-circle-arrow-left black inliner"></span>
<h5 class="inliner lato-dark">Back to Topics</h5>
<% end %>
</div>
<div class="col-md-8">
<div class="js-bookmarks">
<%= render partial: 'bookmarks/bookmark', collection: @bookmarks %>
</div>
</div>
<div class="col-md-2">
<div class="text-center">
<% if policy(@topic).update? %>
<!-- Button trigger modal -->
<button type="button" class="btn button-3d-edit" data-toggle="modal" data-target="#edit">
<span class="glyphicon glyphicon-pencil"></span>
Edit Topic
</button>
<% end %>
<% if policy(@topic).destroy? %>
<%=link_to @topic, method: :delete, class: 'btn button-3d-delete', data: { confirm: 'Are you sure you want to delete this topic?' } do %>
<span class="glyphicon glyphicon-remove"></span>
Delete Topic
<% end %>
<% end %>
<% if policy(@bookmarks).create? %>
<!-- Button trigger modal -->
<button type="button" class="btn button-3d" data-toggle="modal" data-target="#new-bookmark">
<span class="glyphicon glyphicon-plus"></span>
New Bookmark
</button>
<% else %>
<button type="button" class="btn button-3d" data-toggle="modal" data-target="#notSignedIn">
<span class="glyphicon glyphicon-plus"></span>
New Bookmark
</button>
<% end %>
</div>
</div>
</div>
Пожалуйста, введите код для метода 'policy', так как проблема там, вероятно, существует. – infused
Метод политики - это только по умолчанию для Pundit, я даже не уверен, где он находится. Поэтому никаких изменений в нем не было. –