【问题标题】:Only allow owner of article to delete it using Ruby on Rails只允许文章的所有者使用 Ruby on Rails 删除它
【发布时间】:2014-12-31 18:59:26
【问题描述】:

我最近完成了http://guides.rubyonrails.org/getting_started.html并添加了user authentication system,所以只有注册用户才能创建/删除博客文章/文章。但是,目前任何用户都可以删除任何文章。我想将文章的删除/销毁操作的访问权限限制为文章的所有者,即只有文章的所有者才能删除它。

更新我的代码文件如下所示,

Articles_controller.rb

class ArticlesController < ApplicationController

    def destroy
            @article = Article.find_by_slug(params[:id])
            if current_user == @article.user
                @article.destroy
            end

            redirect_to articles_path
    end

Article.rb

class Article < ActiveRecord::Base

# user singluar form of model when using 'belongs_to'
# see this SO thread, http://stackoverflow.com/questions/16257116
belongs_to :user

用户.rb

class User < ActiveRecord::Base

has_many :articles

以及迁移文件,AddUserIdToArticles.rb

class AddUserIdToArticles < ActiveRecord::Migration
  def change
    add_column :articles, :user_id, :integer
    add_column :users, :user_id, :integer
    add_foreign_key :articles, :users
  end
end

【问题讨论】:

  • 到目前为止您尝试过什么?你有身份验证,现在你需要另一部分(授权)关于rails4.x,can can上的railscast有点过时,但你可以看看pundit gem
  • 或者只使用 before_destroy 回调?
  • 我正在研究这样的事情 => stackoverflow.com/a/17793864/708807
  • @Chris 一次性完成,是的,您可以使用 before_action 过滤器,或者您可以将对象查找范围限定为 current_user,因此它只会找到他们拥有的对象,等等……有很多方法可以做这个。

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

假设您有一个辅助函数current_user,您可以在您的articlesController 中执行以下操作:

def destroy
    @article=Article.find(params[:id])
    if current_user == @article.user
        @article.destroy
    end
    redirect_to root_path
end

现在只有当登录的current_user是帖子的实际作者时才会执行销毁操作

【讨论】:

  • 我在 application_controller.rb 中有一个 current_user 实例变量设置,但是当我尝试删除帖子时,它给了我以下错误,我认为 #<0x00000006b08ff0>
【解决方案2】:

在大多数情况下,我会使用诸如 cancancanpundit 之类的授权 gem;这些允许您像描述的那样明确设置授权。对于非常简单的情况,也可以只编写自己的,例如

private

def set_article 
  @article = current_user.articles
end

然后设置创建一个前置过滤器before_filter :set_article, only: [:index, :show]

唯一的部分是可选的,可以省略,以便过滤器应用于控制器中的所有方法。

【讨论】:

    【解决方案3】:
    # user model
    has_many :articles
    
    
    # controller
    def destroy
      current_user.articles.find(params[id]).destroy
      redirect_to root_path
    end
    

    如果 current_user 不是文章的所有者,代码也会引发 404

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多