我是Rails的新手并且正在构建一个工作板市场。我坚持使用用户注册配置文件表单。我正在使用带有Rails 5的设计(4.2)。我在user_create之前创建了配置文件,然后只是重定向到配置文件视图,现在使用注册表单字段来更新用户,例如first_name&姓氏。
我的注册是一个双向进程,而不是嵌套的配置文件。 第1步 - 设计一个额外字段的注册表单,以检查用户(求职者)或公司的角色。 第2步 - 基于此角色,为用户和公司创建单独的配置文件表单。如果配置文件未提交给DB,则也不应保存用户,并且必须再次发生用户sign_up。
目前,我正在尝试使用一个包含first_name和last_name字段的通用用户表单。我在用户模型中使用了before_create:build_profile,但它只传递了Profile.create而没有在DB上创建它。我应该在profiles_controller或registrations_controller(设计)中覆盖'create'or'new'。
views / profiles / show.html.erb中的错误是:表单中的第一个参数不能包含nil或为空。同样在终端上我看到了这个配置文件:“user_id”=>“2”,“id”=>“profile_id”} ...这是否表示数据库中用户和配置文件表之间存在妨碍创建或路线设置正确吗?
的routes.rb
Rails.application.routes.draw do
root "jobs#index"
devise_for :users, :controllers => {registrations: "registrations"}
resources :users do
resources :profiles, only: [:show, :update]
end
end
Registrations_controller
class RegistrationsController < Devise::RegistrationsController
protected
def after_sign_up_path_for(user)
if resource.class == User && current_user.role == 'user'
user_profile_path
else # to check for company user resource.class == User && current_user.role == 'company'
puts "redirecting to company profile-will do later"
end
end
end
profiles_controller.rb
class ProfilesController < ApplicationController
def show
end
def update
@profile = Profile.find_by_user_id(profile_params)
current_user.update(@profile)
end
def destroy
@profile.destroy
respond_with(@profile)
end
private
def profile_params
params.require(:user).permit(profile_attributes: [])
end
def set_profile
@profile = Profile.find(params[:id])
end
end
profile.rb
class Profile < ApplicationRecord
belongs_to :user
end
user.rb
class User < ApplicationRecord
before_create :build_profile
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
enum role: [:user, :company, :admin]
has_one :profile
def build_profile
Profile.create
true
end
答案 0 :(得分:0)
我建议你使用一种基于继承的方法。
您可以在users表中添加一个类型,Rails将为您管理它。
<强> example_timestamp_add_type_to_users.rb 强>
class AddTypeToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :type, :string, null: false
end
end
使用此功能,您可以根据需要添加用户类型:
<强>模型/ job_seeker.rb 强>
class JobSeeker < User
has_one :job_seeker_profile, dependent: :destroy
after_create :profile
private
def profile
create_job_seeker_profile
end
end
<强>模型/ company_owner.rb 强>
class CompanyOwner < User
has_one :company_owner_profile, dependent: :destroy
after_create :profile
private
def profile
create_company_owner_profile
end
end
<强>模型/ admin.rb 强>
class Admin < User
end
此方法允许您使用基于用户类型的身份验证方法:
求职者:
:
:
您还可以为每种用户类型构建不同的注册和/或登录表单:
<强>配置/ routes.rb中强>
Rails.application.routes.draw do
devise_for :admins
devise_for :job_seekers
devise_for :company_owners
end