Ruby on rails RubyonRails设计了用户的返回角色

Ruby on rails RubyonRails设计了用户的返回角色,ruby-on-rails,devise,Ruby On Rails,Devise,我使用我为Desive gem找到的一种非常简单的方法为用户提供了一些角色: 但是现在在用户配置文件页面上,我不知道如何显示用户分配的角色,更不用说能够更改它了。我一直在尝试实际视图中的变体,但没有任何东西可以显示用户的角色类型。以下是其设置方式: user.rb class User < ActiveRecord::Base ... belongs_to :role before_create :set_default_role private def set_d

我使用我为Desive gem找到的一种非常简单的方法为用户提供了一些角色:

但是现在在用户配置文件页面上,我不知道如何显示用户分配的角色,更不用说能够更改它了。我一直在尝试实际视图中的
变体,但没有任何东西可以显示用户的角色类型。以下是其设置方式:

user.rb

class User < ActiveRecord::Base
  ...
  belongs_to :role
  before_create :set_default_role
  private
    def set_default_role
      self.role ||= Role.find_by_name('contractor')
    end
end
更新:

经过更多的胡闹,我发现

<%= Role.where(current_user.id).name %>
<%= Role.where('role_id = ?', current_user.id).name %>

两者都返回相同的东西“角色”,但它不应该返回类似“承包商”的东西吗? 另外,下面是create_roles.rb的迁移:

class CreateRoles < ActiveRecord::Migration
  def change
    create_table :roles do |t|
      t.string :name

      t.timestamps
    end
  end
end
class CreateRoles
更新2:

我意识到,正如教程所说,我已将角色id添加到用户记录中。迁移:

class AddRoleIdToUser < ActiveRecord::Migration
  def change
    add_column :users, :role_id, :integer
  end
end
类AddRoleIdToUser 所以我把代码改成了

<%= User.where("role_id = 'contractor'").name %>

这返回“用户”是多么奇怪!一般来说,我对这种语言和web开发是全新的,但我只希望它返回我的“承包商”或“雇主”角色类型。我做错了什么?

使用这种方法你可能会做得很好


其他模型数据

问题是,您正试图将另一个模型的数据对象加载到当前模型中。这必须是这样的:

@user.role.name # -> "role" is another object, not a naked piece of data
解决方法是添加以下内容:

class User < ActiveRecord::Base
  ...
  belongs_to :role
  delegate :name, to: :role, prefix: true #-> yields @user.role_name

  before_create :set_default_role
  private
    def set_default_role
      self.role ||= Role.find_by_name('contractor')
    end
end
class用户产生@user.role\u姓名
创建前:设置默认角色
私有的
def set_默认_角色
self.role | |=role.find_by_name(“承包商”)
终止
终止

关系数据

如果您是从Rails开始的(顺便说一句,欢迎),那么您应该了解Rails是如何工作的

本质上,您可以使用
id
(称为a)来执行所有操作。这允许不同的模型通过调用各自的ID从相关模型调用数据。这就是为什么您必须将
role\u id
添加到您的用户模型中


我认为学习如何使用从关系模型中调用的数据对象会使您受益匪浅。例如,
@user.role\u id
必须是
角色的对应id
db

谢谢,我在委托中添加了,但在@user.role.name中添加了,但仍然不起作用,它说:“仪表板中的NoMethodError#索引…未定义的方法‘role’表示nil:NilClass”它似乎在我的控制器中寻找
def角色
,这对我来说很奇怪。我还尝试了“current_user.role.name”,但出现了不同的错误。我阅读了关系数据——我想我理解了语法对我来说很难理解的概念。也许是Desive gem把我甩了。Desive只是为登录的用户创建了一个会话——保存的数据还是一样的。在您的
user
表中,是否填充了
role\u id
列?如果是,该列的值是否与角色数据库中的列相对应?关于
nil:NilClass
错误,您如何创建
@user
var?如果您的关联设置正确,那么您根本不必直接引用
角色
模型-您可以这样做:
@user=user.find(5)@user.Role.name
返回角色名:)抱歉,花了一分钟时间,我不得不下载一个.sqlite3查看器。所以我检查了一下,我的users表有role_id,但它没有填充!我认为这是因为我有set_default_角色代码,我不明白为什么不给我的用户分配角色。此外,角色表是完全空白的。我不知道该怎么办,我将删除数据库,重新启动服务器并再次注册以查看发生了什么,所以我这样做了,但它没有在我刚刚创建的新登录上填写我的角色id。所以我不知道为什么,因为所有相关的代码都在那里。此外,我不知道我是如何创建@user var的,或者我是如何创建的-我认为Desive为我做了所有这些,到目前为止,我只为用户发送了电子邮件和我刚刚写的东西,而且效果很好。最终的解决方案是什么?你能在这里写信吗。。我也有同样的问题。请做必要的事
@user.role.name # -> "role" is another object, not a naked piece of data
class User < ActiveRecord::Base
  ...
  belongs_to :role
  delegate :name, to: :role, prefix: true #-> yields @user.role_name

  before_create :set_default_role
  private
    def set_default_role
      self.role ||= Role.find_by_name('contractor')
    end
end