只允许文章所有者使用Ruby on Rails删除它

时间:2014-12-31 18:59:26

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

我最近完成了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

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

3 个答案:

答案 0 :(得分:2)

假设您有辅助函数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是帖子的实际作者时才会执行销毁操作

答案 1 :(得分:1)

在大多数情况下,我会使用cancancanpundit之类的授权gem;这些允许您明确设置您所描述的授权。真正简单的情况也可以自己编写,例如:

private

def set_article 
  @article = current_user.articles
end

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

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

答案 2 :(得分:1)

# user model
has_many :articles


# controller
def destroy
  current_user.articles.find(params[id]).destroy
  redirect_to root_path
end

如果current_user不是文章的所有者

,代码也会引发404