如何只手动显示Rails中管理员的链接?

时间:2014-01-31 04:04:11

标签: ruby-on-rails

我有这个辅助方法

>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这样的宝石,比如我想尝试从头开始构建这个。

非常感谢!!

1 个答案:

答案 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。