[英]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_name
和last_name
的字段,但是我需要用戶將其first_name
和last_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.