ruby 是否将可跟踪(设计)添加到现有用户模型?

abithluo  于 2023-06-05  发布在  Ruby
关注(0)|答案(4)|浏览(556)

**问题:**我以前创建了一个用户模型,其中包含最少的设备信息。我看到devise有一个“可跟踪”的系统,想把它实现到现有的模型中。我补充道:

class AddSignInCountToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :sign_in_count, :integer
  end
end

去测试迁移,但是没用。(我也尝试了这个迁移,使用“default:0,null:false”,结果相同。
一旦我在devise模型中添加“:trackable”,问题似乎就会发生。

登录时收到此错误:

NoMethodError in Devise::SessionsController#create
undefined method `current_sign_in_at' for #<User:0x00007f484e5ef770>
#line with red highlight
        match ? attribute_missing(match, *args, &block) : super

CMD出错前几行**:**

NoMethodError (undefined method `current_sign_in_at' for #<User:0x00007f484e5ef770>):

activemodel (5.2.1) lib/active_model/attribute_methods.rb:430:in `method_missing'

路线:

devise_for :users, controllers: { confirmations: 'confirmations' }

型号:

devise :database_authenticatable, :registerable,
          :confirmable, :recoverable, :rememberable, :validatable, :trackable

        def active_for_authentication?
          super && approved
        end

        def inactive_message
          approved? ? super : :not_approved
        end
...
...
...

这是设计问题还是其他原因造成的?
这个问题是否也可能是因为现有的模型(不确定为什么这是真的,但以防万一),因为如果是这样,我可以重写t并重新创建它,因为它仍在开发中。
我想利用Devise提供的所有功能,并将Devise的其余功能迁移到我的模型中。有人有什么建议吗?

xnifntxz

xnifntxz1#

Trackable模块需要的不仅仅是sign_in_count属性。列出了所需列的完整列表in the documentation如果为其余列添加另一个迁移,则一切都应按预期工作。

mm5n2pyu

mm5n2pyu2#

要让trackable按预期工作,您需要它的所有必需列。
一步一步,就像这样。
首先,使用以下命令创建新的迁移文件:

rails generate migration AddDeviseTrackableColumnsToUsers

编辑新创建的文件以包括以下内容:

class AddDeviseTrackableColumnsToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :sign_in_count, :integer, default: 0, null: false
    add_column :users, :current_sign_in_at, :datetime
    add_column :users, :last_sign_in_at, :datetime
    add_column :users, :current_sign_in_ip, :string
    add_column :users, :last_sign_in_ip, :string
  end
end

运行迁移:

rails db:migrate

最后,更新用户模型以激活可跟踪:

class User < ApplicationRecord
  devise :database_authenticatable, :trackable
end

现在应该能用了🤗

whlutmcx

whlutmcx3#

回复:

(不久之后,我在这里找到了这个:NoMethodError in Devise::SessionsController#create undefined method `current_sign_in_at'
绿色支票的答案帮助。
我第一次尝试简单地添加trackable,没有工作,也不会迁移由于某种原因(没有保存错误)
但他们的第一个recc使用例如:

rake db:migrate:down VERSION=20140126101944 # use version of the user migration
rake db:migrate up VERSION=20140126101944 # use version of the user migration

我遇到的唯一问题是,我添加到用户表中的所有其他迁移都没有沿着迁移(名称等),所以我不得不重新迁移所有内容。
为了澄清,正如其他人建议的那样,我需要更多的列,而不仅仅是一个可跟踪的工作。所以这可能是整个问题。

ut6juiuv

ut6juiuv4#

class AddDeviseTrackableColumnsToUsers < ActiveRecord::Migration[7.0]
  def change
    add_column :users, :sign_in_count, :integer, default: 0, null: false
    add_column :users, :current_sign_in_at, :datetime
    add_column :users, :last_sign_in_at, :datetime
    add_column :users, :current_sign_in_ip, :string
    add_column :users, :last_sign_in_ip, :string
  end
end

相关问题