【问题标题】:ActiveRecord::RecordInvalid: Validation failed: Resource type is not included in the lisActiveRecord::RecordInvalid:验证失败:资源类型未包含在 lis 中
【发布时间】:2015-01-12 07:10:50
【问题描述】:

我是 rails 新手。我正在使用 rolify gem 添加用户角色。 当我尝试从 rails 控制台添加角色时,我遇到了这个问题。有人遇到过这个问题吗?

u = User.first
u.add_role(:admin).save!

错误列表 ===

ActiveRecord::RecordInvalid: Validation failed: Resource type is not included in the list.

Rolify 迁移文件 ============

class RolifyCreateRoles < ActiveRecord::Migration
def change
create_table(:roles) do |t|
t.string :name
t.references :resource, :polymorphic => true
t.timestamps
end

create_table(:users_roles, :id => false) do |t|
  t.references :user
  t.references :role
end

add_index(:roles, :name)
add_index(:roles, [ :name, :resource_type, :resource_id ])
add_index(:users_roles, [ :user_id, :role_id ])

end
end`

我已按照从此处安装 rolify 的文档 == https://github.com/RolifyCommunity/rolify

【问题讨论】:

  • 你有没有在启动 rails 控制台后运行 rake db:migration?
  • 你能把你的模型放在这里吗?
  • class User :add_default_role_to_user #resourcify # 包括默认设计模块。其他可用的有: # :confirmable, :lockable, :timeoutable 和 :omniauthable 设计 :database_authenticable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_and_belongs_to_many :roles, :join_table => :users_roles #after_save :add_default_role_to_user def role ?(role) end def add_default_role_to_user current_user = User.find_by_id self.id #current_user.add_role :normal_user end end
  • 类角色 :users_roles belongs_to :resource, :polymorphic => true 验证 :resource_type, :inclusion => { :in => Rolify.resource_types } 范围结束
  • 这是两个模型。

标签: ruby-on-rails ruby activerecord rolify


【解决方案1】:

似乎在 3.5 版本中,无法像以前的版本那样创建全局角色。 实际上,每当创建角色时,它都需要 resource_type,目前由于您正在创建没有任何资源的全局角色,因此会引发错误。 但是,如果您在实例上创建角色,它将起作用。 假设您有一些名为“Post”的模型

Class Post
  resourcify 
end
On Rails console, create 
user = User.first
user.add_role(:admin, Post.first)

正如我在上面给出的场景一样,当我创建角色时,它会将 resource_type 设为“发布”。但在您的情况下,角色没有获得资源类型。因此,如果您想创建全局角色,那么最好从您的“角色”模型中删除 'validates :resource_type, :inclusion => { :in => Rolify.resource_types }'

【讨论】:

  • 从模型中评论以下行起到了作用'# validates :resource_type, :inclusion => { :in => Rolify.resource_types }, :allow_nil => true'
【解决方案2】:

版本 >= 3.5 有这些问题,暂时使用版本 rolify 3.4。我将修复并发送然后拉取请求。

【讨论】:

  • 我试过了。但它正在制造这个问题。未捕获的异常:Rolify:Module 的未定义方法“resource_types”。这是生成 this 的行。 === 验证 :resource_type, :inclusion => { :in => Rolify.resource_types }
【解决方案3】:

@Sazzad 请按以下方式更改角色模型:

class Role < ActiveRecord::Base 
  has_and_belongs_to_many :users, :join_table => :users_roles belongs_to :resource, :polymorphic => true 

  scopify 
end

【讨论】:

    【解决方案4】:

    您需要在您的 Role 模型上允许 resource_typenil

    对于 Rails 4,我们在 Role 模型中有这个:

    belongs_to :resource, :polymorphic => true
    validates :resource_type,
            :inclusion => { :in => Rolify.resource_types },
            :allow_nil => true
    

    从 Rails 5 开始,默认需要 belongs_to 关联,这就是 optional: true 的来源:

    belongs_to :resource, :polymorphic => true, optional:true
    validates :resource_type,
            :inclusion => { :in => Rolify.resource_types },
            :allow_nil => true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多