2016-11-15 61 views
0

我是新的鐵軌,所以請耐心等待。我的問題非常具體。我正在創建一個用戶博客,他們可以放置任何帖子。所以用戶有博客,博客有帖子。所以當用戶創建博客時,博客中的所有帖子都應該由他撰寫。其他用戶不能寫他們的博客。使用權威寶石軌道的授權設置

post_controller.rb

class PostsController < ApplicationController 
    before_action :authenticate_user! 
    before_action :authorize_user!, only: [:edit, :update, :destroy] 

    expose :blog 
    expose :post 

    def show 
    end 

    def new 
    end 

    def edit 
    end 

    def create 
    post.user = current_user 
    post.save 
    respond_with post, location: user_blog_path(post.blog.user, post.blog) 
    end 

    def update 
    post.update(post_params) 
    respond_with post, location: user_blog_path(post.blog.user, post.blog) 
    end 

    def destroy 
    post.destroy 
    respond_with post, location: user_blog_path(post.blog.user, post.blog) 
    end 

    private 

    def authorize_user! 
    authorize(post, :authorized?) 
    end 

    def post_params 
    params.require(:post).permit(:title, :content, :user_id, :blog_id) 
    end 
end 

這裏我使用的權威人士授權用戶,當他們更新或毀滅的帖子(用戶可以更新或毀滅只是自己的職位)和它完美的作品。

的意見/職位/新

.row 
    .columns 
    h2 = title("New post") 

.row 
    .medium-5.columns 
    = simple_form_for post do |f| 
     = f.error_notification 

     .form-inputs 
     = f.input :title 
     = f.input :content 
     = f.hidden_field :blog_id, value: blog.id 
     .form-actions 
     = f.button :submit 

這裏我使用的是隱藏的表單設置這是我從PARAMS採取blog_id。 Http鏈接看起來像http://localhost:3000/posts/new?blog_id=6。問題是每個用戶都可以複製此鏈接來創建帖子(而且他們不是博客所有者)。

post_policy.rb

class PostPolicy < ApplicationPolicy 
    def authorized? 
    record.user == user 
    end 
end 

我應該如何檢查後創建之前博客的主人?也許我有一個錯誤的方式來創建這樣的帖子(使用隱藏窗體)。

鏈接創建新的崗位

= link_to 'New Post', new_post_path(blog_id: blog.id) 
+0

ÿ我們的'before_action'只在編輯,更新和銷燬時運行。不知道它是否能解決問題,但我認爲你需要從列表中加入':create'開始。 – moveson

+0

@moveson如果我添加:創建,沒有人可以創建帖子。我認爲這是因爲在授權?方法我檢查是否post.user =當前用戶?但是我在創建後設置post.user,所以在授權中? post.user總是會丟失 –

+0

嘗試在'create'操作中設置'post.user = current_user'後,在下一行放置'authorize_user!'。 – moveson

回答

1

我希望,它會爲你工作

application_controller.rb

class ApplicationController 

     include Pundit 

     after_action :verify_authorized, except: :index 
     after_action :verify_policy_scoped, only: :index 

     before_action :authenticate_admin_user! 

     helper_method :current_user 

     def pundit_user 
     current_admin_user 
     end 

     def current_user 
     @current_user ||= User.find(current_admin_user.id) 
     end 

    end 

posts_controller.rb

class PostsController < ApplicationController 

    before_action :set_blog 

    def new 
    authorize(Post) 
    end 

    def edit 
    @post = @blog.posts.find(params[:id]) 
    authorize(@post) 
    end 

    def index 
    @posts = policy_scope(@blog.posts) 
    end 

    private 

    def set_blog 
    @blog = current_user.blogs.find(params[:blog_id]) 
    end 

end 

post_policy.rb

class PostPolicy < ApplicationPolicy 

    def show? 
    true 
    end 

    def index? 
    true 
    end 

    def new? 
    create? 
    end 

    def create? 
    true 
    end 

    def edit? 
    update? 
    end 

    def update? 
    scope_include_object? 
    end 

    def destroy? 
    scope_include_object? 
    end 

    class Scope < Scope 

    def resolve 
     scope.joins(:blog).where(blogs: { admin_user_id: user.id }) 
    end 

    end 

    def scope_include_object? 
    scope.where(id: record.id).exists? 
    end 

end 

routes.rb中

Rails.application.routes.draw do 
    devise_for :admin_users 

    resources :blogs do 
    resources :posts 
    end 
end 
+0

仍然不適用於我 –

+0

您是否在控制器中使用了policy_scope? –

+0

不,我不知道如何 –