这是网上常见的问题,特别是关于堆栈溢出...我知道...
无论如何,我需要对这个常见的新手问题进行一些修改。
我有点复杂的情况,然后我会把它简化。
在我的用户模型上,我获得了所有基础Devise字段,以及一些自定义文件。
要在sing_up
操作上管理此自定义字段,我会覆盖注册控制器,正如官方指南所说,然后我将sign_up_params
函数添加为:
def sign_up_params
params.require(:user).permit(:name, :surname, :username, :birthdate, :email, :password, :password_confirmation)
end
好的,直到这里一切顺利。
现在我还有一个字段,即对另一个用户的引用。 一个用户属于父级,我需要在服务器端计算父级(不应该在表单上执行此操作,“输入类型隐藏”可能会产生安全问题)。
这里有问题:
1-哪里是计算父母的最佳地点?在这个sign_up_params
函数上?
def sign_up_params
parent = do_some_stuff_to_retrieve_parent(params[:some_token])
params.require(:user).permit(:name, :surname, :username, :birthdate, :email, :password, :password_confirmation)
end
2-当我得到父母时,我怎么能把它放到新的User对象中?
有关详细信息,请参阅我的用户模型
class User < ActiveRecord::Base
belongs_to :parent, class_name: "User", foreign_key: "parent_id"
has_many :children, class_name: "User", foreign_key: 'parent_id'
end
在这种情况下,一个孩子只能有一个父母,而一个父母可以拥有他想要的孩子 (欢迎对模型进行任何更正!)
现在我不能写referrer.referrees.create(sign_up_params)
但是我需要做这样的事情(真的是简化而不是真正的代码)
def create
super
parent_id = get_parent_id_from_token(params[:token])
parent = User.find(parent_id)
@user.parent = parent
end
使用此代码我收到此错误:can't write unknown attribute parent_id
。它来自哪里?
答案 0 :(得分:2)
这是一个潜在的解决方案。您没有说明这两个用户之间的关系类型,但我们只是假设它是某种推荐系统,现有用户邀请朋友使用令牌。
在模型中,您可以设置用户之间的关系:
class User < ActiveRecord::Base
belongs_to :referrer, class_name: 'User'
has_many :referrees, through: :referrals, class_name: 'User'
end
然后在控制器中,您可以利用此关系来处理为您设置连接表条目:
class RegistrationsController < Devise::RegistrationsController
def create
referrer = User.find_by(token: sign_up_params[:referrer_token])
referrer.referrees.create(sign_up_params)
#...
end
private
def sign_up_params
params.require(:user).permit(:name, :surname, :username, :birthdate, :email, :password, :password_confirmation, :referrer_token)
end
end
只是一个粗略的想法,没有测试过代码或任何东西:)