我使用了一个非常简单的设计方法为用户添加了一些角色:https://github.com/plataformatec/devise/wiki/How-To:-Add-a-default-role-to-a-User
但现在在用户个人资料页面上,我无法弄清楚如何显示用户的分配角色,更不用说能够更改它了。我在实际视图中尝试了<%= current_user.role %>
的变体,但没有用到显示我用户的角色类型。以下是它的设置方式:
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.rb
class Role < ActiveRecord::Base
has_many :users
end
seeds.rb
['contractor', 'employer', 'business', 'admin'].each do |role|
Role.find_or_create_by_name role
end
更新:
经过更多的搞乱后,我发现了<%= Role.where(current_user.id).name %>
<%= Role.where('role_id = ?', current_user.id).name %>
两者都返回相同的东西&#34;角色&#34;但是,它不应该返回像承包商那样的东西&#34;代替? PS。这是create_roles.rb的迁移:
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.string :name
t.timestamps
end
end
end
更新2:
我意识到我将角色id添加到用户记录中,如教程所述。迁移:
class AddRoleIdToUser < ActiveRecord::Migration
def change
add_column :users, :role_id, :integer
end
end
所以我将代码更改为
<%= User.where("role_id = 'contractor'").name %>
然后返回&#34;用户&#34;多奇怪啊!我对这种语言和网络开发一般都很陌生,但我只是想让它回到我的承包商那里。或者&#39;雇主&#39;角色类型。我做错了什么?
答案 0 :(得分:0)
您可以使用delegate
方法
其他模特资料
问题是,您正在尝试将另一个模型的数据对象加载到当前模型中。这必须像这样工作:
@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
关系数据
如果您从Rails开始(顺便说一句,欢迎使用),您应该了解relational database structures的工作原理
基本上,您使用id
(称为primary_key
)执行所有操作。这允许不同的模型通过调用相应的ID来调用来自相关模型的数据。这就是您必须将role_id
添加到用户模型
我认为您将从学习如何使用从关系模型中回调的数据对象中受益。 I.E @user.role_id
必须是roles
db