0

我正在用 ruby​​ on rails 实现博客应用程序,我想限制普通用户(只有管理员可以创建)创建新文章。为此,我将 befor_filter 放在了后面的articles_controller.rb 文件中。我已经在 UI 中隐藏了用户的创建按钮,但普通用户仍然可以通过在浏览器的地址栏中键入来创建新文章。通过使用下面的代码,普通用户无法进入新文章页面,但它给了我“未定义的方法 `is_admin?我在地址栏中输入。有关更多信息,我已经实现了用户身份验证设计。

class ArticlesController < ApplicationController
  before_filter :is_user_admin, only: [:new, :create]

  def is_user_admin
    unless  current_user.is_admin?
      :root 
      return false
    end
  end
end 



class ArticlesController < ApplicationController
  before_filter :is_user_admin, only: [:new, :create]

  def is_user_admin
    unless  current_user.is_admin?
      :root 
      return false
    end
  end

    def index
        @articles = Article.all(:order => "created_at DESC")
    end

    def show
      @article = Article.find(params[:id])
    end

    def new
      @article = Article.new
    end

    def create
      @article = Article.new(params[:article])
      @article.user_id = current_user.id
      @article.save
      redirect_to article_path(@article)
    end

    def destroy
      @article = Article.find(params[:id])
      @article.destroy
      redirect_to action:  'index'  
    end

    def edit
      @article = Article.find(params[:id])
    end

    def update
      @article = Article.find(params[:id])
      @article.update_attributes(params[:article])
      flash.notice = "Article '#{@article.title}' Updated!"
      redirect_to article_path(@article)
     end
end

applicaiton_controller.rb

class ApplicationController < ActionController::Base
    protect_from_forgery
      def after_sign_in_path_for(user)
         if current_user.is_admin?
             dashboard_index_path
         else
             :root
         end
      end

end

基本上,我想限制普通用户(管理员除外)从 UI(完成)或在地址栏中输入地址来创建、更新或删除文章。我不知道为什么我会得到这个,我能做些什么来避免这种情况。我是否应该在 application_controller.rb 文件中编写上述方法。

4

3 回答 3

2

current_user的显然是零。

您应该放在before_filter :authenticate_user!, :except => [:show, :index]控制器的顶部以验证用户身份。

于 2013-04-13T23:24:14.443 回答
2

您可能希望将用户重定向到登录,以便他们无法访问控制器中的操作(如果他们不是管理员)。因此,您可以执行以下操作:

def is_user_admin
  redirect_to(action: :index) unless current_user.try(:is_admin?)
end 
于 2013-04-13T23:42:16.370 回答
0

在检查权限之前,请确保至少有一个用户。您可以将此代码添加到需要身份验证的每个控制器:

 before_filter :authenticate_user!

这样做,您将始终拥有当前用户,因此将能够按照您在问题上指出的方式检查其权限。

于 2013-04-14T00:10:58.180 回答