2016-04-07 11 views
0

私は簡単なQAフォーラムを作成しようとしています。私は認証のために工夫をし、承認のためにcancancanを使うことに決めました。なぜcancancanは私にいくつかのページにアクセスさせませんか?

Ability.rb:

class Ability 
    include CanCan::Ability 
    def initialize(user) 
     can :read, :all 

     if user && user.role?(:admin) 
      can :access, :rails_admin 
      can :dashboard 
      can :manage, :all 
     elsif user && user.role?(:user) 
      can :create, [Post, Comment] 
      can :update, Post, user_id: user.id 
      can :update, User, id: user.id 
      can [:update, :destroy], Comment, user_id: user.id 
     elsif user && user.role?(:moderator) 
      can [:create, :update, :destroy], [Post, Comment] 
     end 
    end 
end 

記事コントローラ:

class PostsController < ApplicationController 
    before_action :authenticate_user!, except: [:index, :show] 
    load_and_authorize_resource 

    def index 
    @posts = Post.all.order('created_at DESC') 
    end 

    def withtag 
    if params[:tag] 
     @posts = Post.tagged_with(params[:tag]).order('created_at DESC') 
     @tagname = params[:tag] 
     @tag = Tag.find_by_name(params[:tag]) 
    end 
    end 

    def usernews 
    @posts = [] 
    allPosts = Post.all.order('created_at DESC') 
    userTags = current_user.subscribed_tags.map(&:name) 
    allPosts.each do |post| 
     postTags = post.tag_list.split(',') 
     userTags.each do |tag| 
     if postTags.include?(tag) 
      @posts.push(post) 
      break 
     end 
     end 
    end 
    end 

    def userposts 
    @user = User.find(params[:id]) 
    @posts = Post.where(user_id: @user.id).order('created_at DESC') 
    end 

    def new 
    @post = Post.new 
    end 

    def create 
    @post = current_user.posts.build(post_params) 
    @post.user_id = current_user.id 

    if @post.save 
    redirect_to @post 
    else 
     render 'new' 
    end 
    end 

    def show 
    @post = Post.find(params[:id]) 
    end 

    def edit 
    @post = Post.find(params[:id]) 
    end 

    def update 
    @post = Post.find(params[:id]) 

    if @post.update(post_params) 
     redirect_to @post 
    else 
     render 'edit' 
    end 
    end 

    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    redirect_to root_path 
    end 

    private 
    def post_params 
     params.require(:post).permit(:title, :body, :image, :tag_list) 
    end 
end 

Iという私は、usernewsへのアクセスを取得するとタグでタグ付けされているすべての新しい投稿を参照しようとしています登録されているか、一部のユーザーによって作成されたすべての投稿を表示するとエラーが表示される

このページにアクセスする権限がありません

ユーザーの役割が管理者ではないと彼は

できない場合、それは起こります、管理:すべての

を、私はそれを修正し、ユーザーのために、このページへのアクセスを与えることができますどのようにしてモデレータを使用せずに:管理してください。

P .:私もrails_adminを使用していますか?

RailsAdmin.config do |config| 
    config.authenticate_with do 
    warden.authenticate! scope: :user 
    end 
    config.current_user_method(&:current_user) 
    config.authorize_with :cancan 
end 
+0

を明確にあなたがそう、そのページにアクセスする権限を与えていないことを言っています。あなたの許可を確認してください。 –

+0

@ P_M私はそれを理解しますが、なぜですか? can:読む、すべて なぜ機能しないのですか – malworm

答えて

0

この試してみてください:あなたはこのページにアクセスする権限がありません

class Ability 
    include CanCan::Ability 
    def initialize(user) 
     if user 
      can :access, :rails_admin 
      can :dashboard 
      if user.role == :admin 
       can :manage, :all 
      elsif user.role == :user 
       can :create, [Post, Comment] 
       can :update, Post, user_id: user.id 
       can :update, User, id: user.id 
       can [:update, :destroy], Comment, user_id: user.id 
       can :read, :all 
      elsif user.role == :moderator 
       can :read, :all 
       can [:create, :update, :destroy], [Post, Comment] 
      end 
     end 
    end 
end 
関連する問題