2015-09-07 89 views
2

我的策略创建,更新&摧毁“喜欢”要求用户先登录权威人士授权当前用户

我已经措辞政策如下:

class LikePolicy < ApplicationPolicy 
    def create? 
    user && record.user_id == user.id 
    end 

    def update? 
    create? 
    end 

    def destroy? 
    create? 
    end 
end 

我喜欢#创建控制器操作如下:

def create 
    @article = Article.find(params[:article_id]) 
    @like = @article.likes.new(user_id: current_user.id, value: params[:value] == 1 : 1 ? -1) 
    authorize(@like) 
    @like.save 
    redirect_to @article 
end 

这个工程使用策略,以确认用户。然而,已登录是不合逻辑的代码将在前面的等,其中真正水流失败nt_user被引用。

这是如何授权包含user_id的记录的公认做法吗?

回答

3

通常我会处理检查用户是否使用单独的身份验证检查进行登录。如果您的应用程序大多需要用户登录,那么在授权前进行身份验证检查将确保您始终拥有current_user

另外为创建我发现我不喜欢调用new/authorize/save只是为了确保用户正在创建一个属于他们的对象的想法。这是与授权无关的应用程序逻辑。相反,创建你可以简单地通过课堂,专家不介意。

根据您是否先进行身份验证检查,您的授权可以简单地返回true,或者您可以检查!user.nil

我发现最后一件有用的专家是尝试将逻辑抽象为自我记录的方法。它使阅读专家策略更容易,并允许您将逻辑片段抽象到ApplicationPolicy或通过模块包含它们。在下面的例子中,is_owner?可以很容易地被抽象出来,因为它在很多情况下都是可用的。

实施例1:鉴别然后授权

class LikesController 
    # Either from devise, or define in ApplicationController 
    before_action :authenticate_user! 

    def create 
    authorize(Like) 
    article = Article.find(params[:article_id]) 
    article.likes.create(user_id: current_user.id, ...) 
    redirect_to article 
    end 
end 

class LikePolicy < ApplicationPolicy 
    def create? 
    true 
    end 

    def update? 
    is_owner? 
    end 

    def destroy? 
    is_owner? 
    end 

    private 

    def is_owner? 
    user == record.user 
    end 
end 

实施例2:只授权

class LikesController 
    def create 
    authorize(Like) 
    article = Article.find(params[:article_id]) 
    article.likes.create(user_id: current_user.id, ...) 
    redirect_to article 
    end 
end 

class LikePolicy < ApplicationPolicy 
    def create? 
    !user.nil? 
    end 

    def update? 
    is_owner? 
    end 

    def destroy? 
    is_owner? 
    end 

    private 

    def is_owner? 
    user && user == record.user 
    end 
end 
+0

大反馈。 – Dercni