我最近完成http://guides.rubyonrails.org/getting_started.html并添加一个用户的身份验证系统,只有注册的用户可以创建 / 删除博客张贴/文章。但是,目前的任何用户可以删除任何项目。我想要限制对删除的访问 / 销毁行动给所有者的文章文章的即只有一篇文章的所有者可以删除它。

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

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
2014-12-31 00:00:00
问题评论:

而且什么都尝试了到目前为止?您有身份验证,现在您需要的另一部分 (授权) 可以在 railscast 可以是有点过时,对于 rails4.x 而言,但可以看pundit gem类似

或者,只需使用 before_destroy 回调?

我要找成类似此 = > stackoverflow.com/a/17793864/708807

看一看 CanCan github.com/CanCanCommunity/cancancan

@Chris,一个是您可以筛选 before_action,或它将仅查找他们所拥有的等等所以可以只是作用域对象查找到 current_user,...有许多方法可以做到这一点。

回答:

假如您有current_userhelper 函数,可以在您 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 > 我认为我缺少User模型中的模型中的关系到Article模型。

是您需要的 has_many 和 belongs_to 进行相应能够引用 @article.user

别忘了如果要隐藏链接语句"删除"在视图中使用同一个

对模型,添加的has_manybelongs_to ,但我仍然不能删除的文章,我完成 302 位于 2 毫秒的开发日志中收到以下 (ActiveRecord: 0.4ms年)

您生成迁移将外键添加到文章表吗?

我会使用如cancancanpundit授权 gem,在大多数情况下;这些规则可以显式设置像您所述的授权。也可以非常简单的情况下,只需编写您自己的如

private

def set_article 
  @article = current_user.articles
end

然后创建一组筛选器之前before_filter :set_article, only: [:index, :show]

唯一部分是可选的可以省略筛选器将应用于该控制器中的所有方法。

# user model
has_many :articles


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

如果 current_user 不是项目的所有者,该代码还会引发 404

请输入您的翻译

Only allow owner of article to delete it using Ruby on Rails

确认取消