我一直在开发社交链接聚合网站,并且在管理权限方面陷入困境。
目前,所有用户都可以编辑和销毁他们自己的帖子(包括管理员),但是当管理员尝试删除其他用户创建的帖子时会引发错误。
虽然我非常精通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
如果您需要更多信息我会乐意提供,或者如果我发布的任何代码与问题无关,请告诉我,我会将其从交。
答案 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