Rails的自定义字段设计sign_up操作

时间:2015-06-16 22:17:09

标签: ruby-on-rails devise

这是网上常见的问题,特别是关于堆栈溢出...我知道...
无论如何,我需要对这个常见的新手问题进行一些修改。

我有点复杂的情况,然后我会把它简化。

在我的用户模型上,我获得了所有基础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对象中?

编辑06/17/15

有关详细信息,请参阅我的用户模型

    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。它来自哪里?

1 个答案:

答案 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

只是一个粗略的想法,没有测试过代码或任何东西:)