2015-06-17 2 views
0

У меня проблема с политикой. Когда пользователь создает тему, они должны иметь возможность видеть кнопки редактирования и удаления для этой темы, однако эти кнопки не отображаются. Но, если роль пользователя определяется как 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> 
+0

Пожалуйста, введите код для метода 'policy', так как проблема там, вероятно, существует. – infused

+0

Метод политики - это только по умолчанию для Pundit, я даже не уверен, где он находится. Поэтому никаких изменений в нем не было. –

ответ

0

Таким образом, в процесс попытки обмануть меня вокруг, я нашел ответ. Темы создавались с user_idnil, поэтому Pundit не смог отслеживать, была ли конкретная тема создана конкретным пользователем или нет.

Итак, в моем файле topic_controller я сделал добавление @topic.user = current_user, который затем начал устанавливать user_id для созданных тем, позволяя Pundit отслеживать, кто создал эту тему.

def create 
    @topic = Topic.new(topic_params) 
    @topic.user = current_user 
    @new_topic = Topic.new 
    authorize @topic 
    if @topic.save 
     flash[:notice] = "Topic was created successfully." 
    else 
     flash[:error] = "There was an error creating your topic. Please try again." 
    end 

    respond_to do |format| 
     format.html 
     format.js 
    end 
    end