【问题标题】:Rails and devise: model attribute not being persistedRails 和设计:模型属性没有被持久化
【发布时间】:2015-01-17 03:50:58
【问题描述】:

我编辑了 devise 的 RegistrationsController::create 方法以稍微修改行为。我要做的是,如果数据库中没有管理员用户,那么首先注册的用户将被分配管理员角色,否则它将是普通用户。

但是,尽管角色已正确分配给对象(经过测试),但它并没有被持久化到数据库中。

型号:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessor :role

  Roles = [ :admin, :default ]

  def is? requested_role
    self.role == requested_role.to_s
  end

  def self.admin_role
    return Roles[0]
  end

  def self.default_role
    return Roles[1]
  end
end

修改设计方法:

def create
  build_resource(sign_up_params)

  admin_user = User.find_by_role(User.admin_role)
  if admin_user.nil?
    resource.role = User.admin_role
  else
    resource.role = User.default_role
  end

  # here puts resource.role shows what's expected is indeed being assigned to the object

  if resource.save
    ...
  end
end

为什么role 没有存储在数据库中?为什么是NULL

【问题讨论】:

  • 尝试resource.save!(bang版)保存时是否有效。我敢打赌,事实并非如此。

标签: ruby-on-rails ruby-on-rails-4 devise


【解决方案1】:

如果您将 attr_accessor 定义为表上的列,则不需要 :roleattr_accessorActiveRecord 只需在相关表中定义相关列即可为您提供支持 accessors 的数据库。

您的attr_accessor 将覆盖这些并阻止它们将您的更改持久化到数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2012-01-05
    • 2016-02-08
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多