使用 devise 通过参数将属性值传递给新用户

Pass attribute value via params to new user with devise

我正在为我的网页开发推荐系统。到目前为止,我创建了一个具有 1 对 1 自引用关联的设计用户。

class User < ActiveRecord::Base
  before_create :create_ref

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

  has_many :accounts
  has_one :referel, class_name: "User", foreign_key: :user_id
  belongs_to :referer, class_name: "User", foreign_key: :user_id
end

此用户获得一个唯一的推荐号码 ref,该号码包含在推荐 link 中,他可以与朋友分享。路线看起来像这样

get   '/join/:ref' => 'devise/registrations#new'
post  '/join/:ref' => 'devise/registrations#create'

现在,如果用户 a 有 ref 1340 并且用户 b 打开 /join/1340,我可以通过 params[:ref] 获得正确的号码,从而再次找到用户 a。但我不确定如何在新操作或创建操作中将用户 b 的 user_id 设置为 User.find_by_ref(params[:ref]).id

我已经创建了用于注册的设计控制器,但我不知道如何以正确的方式更改新方法。

我还尝试使用 before_create 在用户模型中调用实例方法,但是当我调用创建方法时,url 会在我可以使用参数之前发生变化。

对此有什么想法吗?

此致。

通过一些变通办法,现在可以正常使用了。对此并不完全满意,但这是一个开始...

我现在正在我的应用程序控制器中使用会话来保存我的参数中的 ref 并将其放入隐藏的表单字段中。看起来像这样:

class ApplicationController < ActionController::Base
   before_action :capture_ref

   private

   def capture_ref
     session[:ref] = params[:ref] if params[:ref]
   end

它像这样工作得很好,但我认为它不是很精简,因为即使我只在注册时才需要它,但每次操作都会触发此方法。我也不喜欢使用隐藏字段,因为它有时可能是一个安全问题,所以我会尝试将其放入我的模型中。