通过params将属性值传递给具有设计的新用户

时间:2015-04-21 10:26:16

标签: ruby-on-rails devise params

我正在为我的网页制作推荐系统。到目前为止,我创建了一个具有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,该号码会包含在他可以与朋友分享的推介链接中。路线看起来像这样

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

现在,如果用户a有参考号1340且用户b打开/join/1340,我可以通过params[:ref]获得正确的号码,这会再次导致用户a。但我不确定如何在新建或动作上将用户b的user_id设置为User.find_by_ref(params[:ref]).id

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

我还尝试使用before_create在用户模型中调用实例方法,但是当我调用create方法时,url将在我使用params之前更改。

有关于此的任何想法吗?

最好的问候。

1 个答案:

答案 0 :(得分:0)

现在有了一些解决方法。对此并不完全满意,但这是一个开始...

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

class ApplicationController < ActionController::Base
   before_action :capture_ref

   private

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

它运作良好,但我不认为它非常精益,因为这个方法在每个动作都被触发,即使我只需要注册。此外,我不喜欢使用隐藏字段,因为它有时可能是一个安全问题所以我会尝试将其放入我的模型中。