Rails,枚举角色

时间:2016-01-16 23:07:04

标签: ruby-on-rails ruby enums devise

使用用户模型创建枚举

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  enum role: [:user, :manager]
  has_many :tickets
end

当我将sign_up作为user.manager时,我收到错误

undefined method `manager?' for nil:NilClass

我的观点 _header.html.haml

%div
  .navbar.navbar-fixed-top.navbar-inverse
    %ul
      -if user_signed_in?
        %li= link_to 'New ticket', new_ticket_path, class: 'btn btn-danger'
        %li= link_to 'Log out', destroy_user_session_path,
                                class: 'btn btn-primary',
                                method: :delete
      -elsif current_user.manager?
        %li= link_to 'All tickets', '#'
      -else
        %li= link_to 'Sign up', new_user_registration_path, class: 'btn btn-primary'
        %li= link_to 'Log in', new_user_session_path, class: 'btn btn-primary'

2 个答案:

答案 0 :(得分:2)

  -if user_signed_in?
    # skipped
  -elsif current_user.manager?
    # skipped 

您撰写的内容不合逻辑,因为current_user仅在用户登录时定义。

当没有用户登录时,会调用elsif,因此显然会抛出错误,因为它正在调用nil上的方法(no {{ 1}})。

答案 1 :(得分:1)

要添加%div .navbar.navbar-fixed-top.navbar-inverse %ul -if user_signed_in? = content_tag :li, link_to('New ticket', new_ticket_path, class: 'btn btn-danger') = content_tag :li, link_to('Log out', destroy_user_session_path, class: 'btn btn-primary', method: :delete) = content_tag :li, link_to('All tickets', '#') if current_user.manager? -else = content_tag :li, link_to('Sign up', new_user_registration_path, class: 'btn btn-primary') = content_tag :li, link_to('Log in', new_user_session_path, class: 'btn btn-primary') 的答案,您需要使用以下内容:

{{1}}