我最近完成了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
答案 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)
在大多数情况下,我会使用cancancan或pundit之类的授权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