簡體   English   中英

Rails添加額外的文件

[英]Rails adding extra fileds

這是我的設備注冊頁面定制:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: {:class => 'text-left'}) do |f| %>
          <div class="form-group">
            <%= f.label :first_name, 'First Name' %><br />
            <%= f.email_field :first_name, autofocus: true, placeholder: "First Name", class: "form-control" %>
          </div>

          <div class="form-group">
            <%= f.label :last_name, 'Last Name' %><br />
            <%= f.email_field :last_name, autofocus: true, placeholder: "Last Name", class: "form-control" %>
          </div>

          <div class="form-group">
            <%= f.label :email, 'Email' %><br />
                    <%= f.email_field :email, autofocus: true, placeholder: "Email", class: "form-control" %>
          </div>
          <div class="form-group">
            <%= f.label :password %>
            <%= f.password_field :password, autocomplete: "off", placeholder: "Password", class: "form-control" %>
          </div>

          <div class="form-group">
            <%= f.label :password_confirmation, 'Confirm Password' %>
            <%= f.password_field :password_confirmation, autocomplete: "off", placeholder: "Confirm Password", class: "form-control" %>
          </div>
          <button type="submit" class="btn btn-default signup-btn">Submit</button>
        <% end %>

接下來是我的registration_controller.rb

class RegistrationsController < Devise::RegistrationsController

    def create
        @user = User.build(user_params)
        if @user.sign_up
            sign_in_and_redirect(:user, @user)
        end

        logger.info "event=custome registration is successful #{@user}"
    end


    def new
        super
    end

    private 

    def user_params
        params.require(:user).permit(:first_name,:last_name, :email, :getting_started, :password, :password_confirmation)
    end

end

問題是,在我的User模型中,我沒有first_namelast_name的字段,但是我需要用戶將其first_namelast_name注冊到配置文件頁面。 如何實現此目標,因為每次注冊新用戶時,我都會收到#`的錯誤undefined method first_name'。 謝謝

編輯

用戶模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook]


  has_one :profile
  delegate :id, to: :person, prefix: true

  has_many :products


  def self.init
    Rails.logger.info("HERE IS INSIDE SELF INIT....")
  end

  def self.from_omniauth(auth)

        where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
        user.email = auth.info.email
        user.password = Devise.friendly_token[0,20]
        #user.name = auth.info.name   # assuming the user model has a name
        #user.image = auth.info.image # assuming the user model has an image
      end
    end

  def self.build(opts = {})
    u = User.new(opts.except(:profile, :id))
    u.setup(opts)
    u
  end

  def setup(opts)
    self.email = opts[:email]
    self.valid?
    self.set_profile(Profile.new((opts[:profile] || {}).except(:id)))
    self
  end

  def set_profile(profile)
    logger.info "PROFILE #{profile}"
    self.profile = profile
  end

    def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
        user.email = data["email"] if user.email.blank?
      end
    end
  end

  def sign_up
      save
  end


end

資料模型:

class Profile < ActiveRecord::Base

    belongs_to :user
end

您可以在用戶模型上將first_name和last_name聲明為非持久屬性,如下所示:

attr_accessor :first_name, :last_name

然后像這樣聲明一個after_save回調:

after_save :save_profile

def save_profile
  profile.update(first_name:first_name, last_name:last_name)
end

編輯:您可能應該為after_save回調包含一個if塊,因為如果您尚未在用戶模型上設置名稱字段,則它可能會清除配置文件信息:

after_save :save_profile, if: -> {first_name && last_name}

您可以在這里使用任何適合您的邏輯,例如{first_name || last_name} {first_name || last_name}等。

暫無
暫無

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

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