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