gpt4 book ai didi

ruby-on-rails - Rails 4.0 Devise 3.x 并将自定义列添加到 STI 用户模型

转载 作者:行者123 更新时间:2023-12-04 19:53:48 25 4
gpt4 key购买 nike

我有一个运行 devise 3.x 的 Rails 4 应用程序,但我无法将 :first_name 列添加到我的 Player 模型。我有 2 个独立的模型继承自 User 模型 - PlayerCoach

我关注了this 12 spokes发布但无法在开发模式下呈现注册表单。

我有一个类 PlayerParameterSanitizer 来覆盖这个设计 signup action并添加 :first_name 参数

class PlayerParameterSanitizer < Devise::ParameterSanitizer
def sign_up
default_params.permit(:type, :email, :password, :password_confirmation, :first_name)
end
end

然后我在应用程序 Controller 中创建了这个类的一个新对象

class ApplicationController < ActionController::Base
protect_from_forgery with: :exception

protected

def devise_parameter_sanitizer
if resource_class == Player
PlayerParameterSanitizer.new(Player,:player,params)
elsif resource_class == Coach
CoachParameterSanitizer.new(Coach,:coach,params)
else
super
end
end

end

我正在 config/initializers/sanitizers.rb 中的初始化程序中加载 sanitizer

require "#{Rails.application.root}/lib/player_sanitizer.rb"

但是,我还是得到了

undefined method `first_name' for #<Player:0x00000101cafab0>

view/players/registrations/new.html.erb 页面上。我在这里缺少什么?

更新

数据库架构

  create_table "players", force: true do |t|
t.datetime "created_at"
t.datetime "updated_at"
t.string "first_name"
end

更新 #2

devise_for :players, :controllers => {:registrations => "players/registrations",
:sessions => "players/sessions",
:passwords => "players/passwords"}

无关理智的模型

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

end

Player类继承自User。

class Player < User

end

更新 #3

我认为我不应该以这种方式使用 STI。

我希望教练和球员共享 Devise Auth 功能,但球员将拥有教练的其他字段(俱乐部、位置、年份等)

对于 Rails 4 的 STI,所有属性都将存储在用户表中。但这意味着 Coach 将拥有这些字段,但在其表中被保存为对于位置、当前俱乐部等内容为 nil。

这似乎不正确..

基本上,我希望 Coach 和 Player 都继承自 User 以实现设计功能。但是,我希望 Player 除了 Coach 之外还有几个字段。

最佳答案

您也可以使用多态性,并且不会共享数据库属性。类似于以下内容:

class Login < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

belongs_to :user, polymorphic: true
end

class Player < ActiveRecord::Base
has_one :login, as: :user
end


class Coach < ActiveRecord::Base
has_one :login, as: :user
end

这只是给你一个大概的想法。请注意,我没有尝试过任何这些,如果您在 Devise 中使用未命名为 User 的类,可能需要特别小心。祝你好运!

关于ruby-on-rails - Rails 4.0 Devise 3.x 并将自定义列添加到 STI 用户模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com