Ruby on Rails设计用户的返回角色

时间:2013-12-29 11:31:24

标签: ruby-on-rails devise

我使用了一个非常简单的设计方法为用户添加了一些角色: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;角色类型。我做错了什么?

1 个答案:

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

的相应ID