如何通过设计管理员用户在社交网站上启用帖子删除?

时间:2015-09-22 10:35:48

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

我一直在开发社交链接聚合网站,并且在管理权限方面陷入困境。

目前,所有用户都可以编辑和销毁他们自己的帖子(包括管理员),但是当管理员尝试删除其他用户创建的帖子时会引发错误。

虽然我非常精通ruby,但我的导轨知识严重缺乏,所以很可能是一种非常简单的盯着我的脸。

在尝试编辑帖子时,错误是:未定义的方法`model_name' for TrueClass:Class

当试图删除帖子时,错误是:未定义的方法`destroy'为true:TrueClass

以下是我的links_controller.rb的相关部分:

  def update
respond_to do |format|
  if @link.update(link_params)
    format.html { redirect_to @link, notice: 'Link was successfully updated.' }
    format.json { render :show, status: :ok, location: @link }
  else
    format.html { render :edit }
    format.json { render json: @link.errors, status: :unprocessable_entity }
      end
  end
end

  def destroy
@link.destroy
respond_to do |format|
  format.html { redirect_to links_url, notice: 'Link was successfully destroyed.' }
  format.json { head :no_content }
    end
end

    def authorized_user
  @link = current_user.links.find_by(id: params[:id]) || current_user.admin?
  redirect_to links_path, notice: "Not authorized to edit this link" if @link.nil?
 end

用户模型:

class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable
has_many :links
has_many :posts
acts_as_voter
validates :twitter, :twitter => { :format => :username_with_at,        allow_blank: true }
validates :avatar_url, :url => { allow_blank: true }
 end

管理模式:

class Admin < ActiveRecord::Base
devise :database_authenticatable, :trackable, :timeoutable, :lockable
end

如果您需要更多信息我会乐意提供,或者如果我发布的任何代码与问题无关,请告诉我,我会将其从交。

3 个答案:

答案 0 :(得分:0)

@link如果current_user为admin,则为true,不正确,@link应为Link的实例

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?

您应该使用授权gem来检查权限,例如action_access,cancan,cancancan,pundit,......

答案 1 :(得分:0)

问题是以下一行

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?

如果用户是admin,那么@link的值将为'true'

因此@link.destroy变为true.destroy,这不是有效的功能

答案 2 :(得分:0)

  

TrueClass的未定义方法`model_name':Class

这基本上意味着您已使用true而不是对象填充变量。你已经知道了;它应该指导您寻找识别问题的方法:

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?

此处的错误是您正在调用current_user.admin?。因为你的初始参数返回false,所以Ruby指的是最后一个。 admin?方法必须返回true

-

<强>授权

对此的修复称为Authorization

你可能已经知道了;在Rails意义上,授权目前根本没有得到很好的处理。 Ryan Bates(Railscasts成名)的最佳实现是CanCan

简而言之,您需要的是某种系统,它会检查您的身份,并允许您根据您的凭据执行操作。

如果你手动处理,你可以这样做:

@link = current_user.links.find_by(id: params[:id]) || (Link.find(params[:id]) if current_user.admin?) #-> not tested!!!

如果你使用了CanCan之类的东西(现在更新为CanCanCan),你可以使用:

#app/controllers/your_controller....
def destroy
  @link = Link.find params[:id]
  @link.destroy if can? :destroy, @link
end

#app/models/ability.rb
class Ability
   include CanCan::Ability
   def initialize(user) 
       user ||= User.new # guest user (not logged in)
       can :manage, :all if user.has_role? :admin
       can [:update, :destroy], Link, user_id: user.id
   end
end