我有这个辅助方法
>def admin?
>@user.email == "X@gmail.com"
>end
这个用户模型
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
attr_accessor :password
before_save :encrypt_password
validates_confirmation_of :password
validates_presence_of :password, :on => :create
validates_presence_of :email
validates_uniqueness_of :email
validates_format_of :email, :with => /^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i
def self.authenticate(email, password)
user = find_by_email(email)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
user
else
nil
end
end
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
end
但是,当我尝试访问这行代码时
&lt;%= link_to'Edit',edit_post_path(post)if admin? %GT;
它说有一个未定义的方法电子邮件。我只想让自己能够编辑和制作博客文章,所以这就是我要采用的方法。我愿意接受任何更高效的建议,但是想避免像管理员那样使用像cancan这样的宝石,比如我想尝试从头开始构建这个。
非常感谢!!
答案 0 :(得分:1)
为什么不在您的User模型中添加一个admin列,其中true = admin,false = not。这样你就不必硬编码谁是模特中的管理员。
您目前拥有的代码不会按照您希望的方式执行。 @user是您在给定页面上时返回的用户。您想查看登录用户是否为管理员,而不是@user(假设您遵循正常的rails约定)。
我会:
rails g migration AddAdminToUsers admin:boolean
然后在模型中:
def admin?
self.admin
end
然后在视图中:
<%= your code here if current_user.admin? %>
您必须检索current_user,但如果没有看到您的代码,则必须自己执行此操作。
编辑:并在创建时初始化用户以使admin = false。