如何从设计中检查当前用户是否具有特定的属性集

How to check if the current user from devise has a certain attribute set

对于这个网站,我使用 devise 来创建用户配置文件。一些用户具有特殊的权限属性。在这种情况下 db_admin_status 是一个布尔属性。如果用户将此设置为 True,那么我希望某些导航链接出现在页面上。

这就是用户模型的样子

Table name: users
#
#  id                     :bigint           not null, primary key
#  db_admin_status        :boolean
#  email                  :string           default(""), not null
#  encrypted_password     :string           default(""), not null
#  name                   :string
#  remember_created_at    :datetime
#  reset_password_sent_at :datetime
#  reset_password_token   :string
#  user_name              :string
#  created_at             :datetime         not null
#  updated_at             :datetime         not null

对于这个 rails 项目,我使用 application.html.erb 和 Bootstrap。所以在我的折叠导航栏中,我嵌入了其他 if 语句(确实有效):

<%if current_user.db_admin_status == 'true'%>
 <!--- links appear on nav bar-->
<%end%>

然而,即使我当前登录的用户将属性设置为 true,链接仍然不会显示

您想将您的属性作为布尔值而不是字符串进行比较。

current_user.db_admin_status == true

尽管我会创建一个辅助方法来检查用户是否有资格显示 link 并从您的视图中调用该方法。

def should_show_some_link?
  current_user.db_admin_status? #which will return true or false
end 

您的列 db_admin_status 也没有设置为默认值,这是您想要的吗?当新用户创建时,该值将为 nil 而不是 false。

步骤 1.)

您不需要在条件语句中使用任何比较,因为布尔变量本身只会导致 true/false。

简单做

<% if current_user.db_admin_status %>
  // your code
<% end

应该足够了。

步骤 2.)

当 db_admin_status 的值为 null(尚未设置)时,您可能 运行 会遇到麻烦。您可以通过在数据库架构中将该字段默认为 false 来解决此问题:

运行 以下命令创建 rails 迁移以将 db_admin_status 字段更新为默认为 false。

rails g migration DefaultDbAdminStatusToFalseOnUser

这应该创建一个文件 db/migrate/20130201121110_default_db_admin_status_to_false_on_user.rb

class DefaultDbAdminStatusToFalseOnUser < ActiveRecord::Migration
  def change
    // your changes go here
  end
end

修改此文件以更新您在用户 table 上的字段。

change_column :users, :db_admin_status, :boolean, :default => false

然后最后通过 运行ning 迁移您的更改:

rake db:migrate