Ruby on rails 如何通过设计管理员用户在社交网站上实现帖子删除?

Ruby on rails 如何通过设计管理员用户在社交网站上实现帖子删除?,ruby-on-rails,ruby,ruby-on-rails-4,devise,rubygems,Ruby On Rails,Ruby,Ruby On Rails 4,Devise,Rubygems,我一直在一个社交链接聚合器网站上工作,在管理权限方面遇到了麻烦 目前,所有用户都可以编辑和销毁自己的帖子(包括管理员),但管理员试图删除另一用户创建的帖子时会引发错误 虽然我对ruby相当精通,但我的rails知识严重不足,因此它很可能是一个非常简单的东西 尝试编辑帖子时,错误为:TrueClass:Class的未定义方法“model\u name” 尝试删除帖子时,错误为:未定义true:TrueClass的方法'destroy' 以下是my links_controller.rb的相关部分:

我一直在一个社交链接聚合器网站上工作,在管理权限方面遇到了麻烦

目前,所有用户都可以编辑和销毁自己的帖子(包括管理员),但管理员试图删除另一用户创建的帖子时会引发错误

虽然我对ruby相当精通,但我的rails知识严重不足,因此它很可能是一个非常简单的东西

尝试编辑帖子时,错误为:TrueClass:Class的未定义方法“model\u name”

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

以下是my 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用户{:格式=>:username\u,其中\u位于,允许\u blank:true}
验证:avatar\u url,:url=>{allow\u blank:true}
结束
管理模式:

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

如果您需要更多信息,我很乐意提供,或者如果我发布的任何代码与问题无关,请告诉我,我会将其从帖子中删除。
将为
如果当前用户是admin,则不正确,
应该是
链接的一个实例

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

您应该使用授权gem来检查权限,如action\u access、cancan、cancancan、pundit等
@link
为true
如果当前用户是admin,则不正确,
@link
应该是
link
的一个实例

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

您应该使用授权gem来检查权限,如操作访问、cancan、cancancan、pundit等问题如下

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?
这里,如果用户是admin,@link的值将为true


因此
@link.destroy
变为
真。destroy
不是有效函数

问题如下

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?
这里,如果用户是admin,@link的值将为true

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

TrueClass:Class的未定义方法“model_name”

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

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?
这里的错误是您正在调用
当前用户.admin?
。因为您的初始参数返回false,所以Ruby引用的是最后一个参数。
admin?
方法必须返回
true

--

授权

解决这个问题的方法叫做

你可能已经知道了;在Rails的意义上,授权目前处理得不是很好。最好的实现是由Ryan Bates(Railscasts的知名度)完成的

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

如果您手动处理此问题,您将执行以下操作:

@link = current_user.links.find_by(id: params[:id]) || (Link.find(params[:id]) if current_user.admin?) #-> not tested!!!
如果您使用CanCan(现在更新为)之类的东西,您可以使用:

#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
TrueClass:Class的未定义方法“model_name”

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

@link = current_user.links.find_by(id: params[:id]) || current_user.admin?
这里的错误是您正在调用
当前用户.admin?
。因为您的初始参数返回false,所以Ruby引用的是最后一个参数。
admin?
方法必须返回
true

--

授权

解决这个问题的方法叫做

你可能已经知道了;在Rails的意义上,授权目前处理得不是很好。最好的实现是由Ryan Bates(Railscasts的知名度)完成的

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

如果您手动处理此问题,您将执行以下操作:

@link = current_user.links.find_by(id: params[:id]) || (Link.find(params[:id]) if current_user.admin?) #-> not tested!!!
如果您使用CanCan(现在更新为)之类的东西,您可以使用:

#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