簡體   English   中英

Rails Devise sign_up操作的自定義字段

[英]Custom field for Rails Devise sign_up action

這是網上的一個常見問題,特別是在堆棧溢出的地方...我知道...
無論如何,我需要對該通用Rails新手問題進行一些改動。

我有一些復雜的情況,然后我將其簡化。

在我的用戶模型上,我得到了所有基本的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對象中?

編輯15年6月17日

有關更多信息,這是我的用戶模型

    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 它從何而來?

這是一個潛在的解決方案。 您沒有指定兩個用戶之間的關系類型,而是假設這是一種推薦系統,其中現有用戶邀請具有令牌的朋友。

在模型中,您可以設置用戶之間的關系:

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

只是一個大概的想法,還沒有測試代碼或其他任何東西:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM