允许带定制设计注册的嵌套属性的参数
问题描述:
在我的Rails应用程序中,我有一个用户和一个配置文件属于用户的配置文件。允许带定制设计注册的嵌套属性的参数
我已覆盖正常的设计注册控制器,以避免在注册表单中询问用户密码。我也以相同的形式创建配置文件资源作为嵌套资源。当我提交表单时,配置文件资源被创建,但没有任何来自表单的信息。
从我的形式PARAMS大致如下:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"2sFwrzojZOwB0U/TRScuT9x8lInXGyJX/G1WrYiJOBfFwsT79xlZHZnje1kGAgyzxZtVJ6F3PW4YzQTnDUsZwg==", "user"=>{"role"=>"junior", "profile"=>{"first_name"=>"Test", "last_name"=>"asldm2"}, "email"=>"[email protected]", "language"=>"javascript"}}
我可以看到这是为什么:
Unpermitted parameters: profile
我的问题是,告诉设计在注册时接受轮廓参数。
继这里的帮助:https://github.com/plataformatec/devise#strong-parameters我试图在我的ApplicationController中配置参数
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up) do |user_params|
user_params.permit([:id, :email, profile_attributes: [:id, :first_name, :last_name, :role]])
end
end
end
我的用户的用户模型看起来像下面。请注意我的方法来创建一个自动生成的密码
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :profile, dependent: :destroy
before_validation :generate_password, on: :create
accepts_nested_attributes_for :profile
def self.create_with_password(params)
@email = params[:email]
generated_password = Devise.friendly_token.first(8)
@user = self.create!(email: @email, password: generated_password)
UserNotifier.send_sign_up_email(@user, generated_password).deliver if @user.persisted?
return @user
end
def generate_password
generated_password = Devise.friendly_token.first(8)
self.password = self.password_confirmation = generated_password if !self.password.blank?
end
def password_required?
new_record? ? false : super
end
end
我的剖面模型是这样的:
class Profile < ApplicationRecord
belongs_to :user
end
此外,下面是我这个RegistrationController里面我是用打电话给我的用户的创建方法模型
class RegistrationsController < Devise::RegistrationsController
def create
logger.debug "Registrations create"
@user = User.create_with_password(user_params)
logger.debug "Registrations user created with password"
@user.build_profile
@user.update(user_params)
logger.debug "User: #{@user.inspect}"
sign_in(@user)
redirect_to user_url
end
private
def user_params
params.require(:user).permit([:id, :email, profile_attributes: [:id, :first_name, :last_name, :role, :language]])
end
end
我的注册形式如下:
<%= form_for :user, url: {controller: :registrations, action: :create} do |f| %>
<ul class="flex-outer">
<li>
<label>I am a</label>
</li>
<%= f.fields_for :profile do |pf| %>
<ul class="flex-inner role">
<li class="role-radio">
<%= pf.radio_button :role, 'junior' %>
<label for="user_role_junior">
<div class="role-div">
<div class="role-circle">
<img src="svg/student.svg" alt="student icon">
</div>
<div>Junior</div>
</div>
</label>
</li>
<li class="role-radio">
<%= pf.radio_button :role, 'employer' %>
<label for="user_role_employer">
<div class="role-div">
<div class="role-circle">
<img src="svg/employer.svg" alt="employer icon">
</div>
<div>Employer</div>
</div>
</label>
</li>
</ul>
<li>
<%= pf.label :first_name, "First Name" %>
<%= pf.text_field :first_name, id: "first-name", placeholder: "Jon" %>
</li>
<li>
<%= pf.label :last_name, "Last Name" %>
<%= pf.text_field :last_name, id: "last-name", placeholder: "Snow" %>
</li>
<li>
<% end %>
<%= f.label :email, "Email" %>
<%= f.text_field :email, id: "email", placeholder: "[email protected]" %>
</li>
<li>
<%#f.label :'company-name', "Company name" %>
<%# f.text_field :'company-name', id: "company-name", placeholder: "Winterfell Ltd" %>
<!-- <label for="company-name">Company name</label>
<input type="company-name" id="company-name" placeholder="Winterfell Ltd"> -->
</li>
<li>
<label>I want to receive my test in</label>
</li>
// Fields removed for brevity
<li class="submit-button">
<button type="submit">Submit</button>
</li>
</ul>
<% end %>
有人能帮我解决这个问题吗?
编辑:更新以包括形式和routes.rb中
Rails.application.routes.draw do
devise_for :user, skip: [:sessions], controllers: {registrations: 'registrations'}
as :user do
delete 'sign_out', to: 'devise/sessions#destroy', as: :destroy_user_session
get 'sign_in', to: 'devise/sessions#new', as: :new_user_session
post 'sign_in', to: 'devise/sessions#create', as: :user_session
end
resource :user, path: 'account' do
resource :profile, :test
resources :connections
end
get '/how-it-works' => 'home#how-it-works'
get '/sign-up' => 'home#sign-up'
get '/user' => 'users#index', as: :user_root
root 'home#index'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
耙路线情况如下:
Prefix Verb URI Pattern Controller#Action
new_user_password GET /user/password/new(.:format) devise/passwords#new
edit_user_password GET /user/password/edit(.:format) devise/passwords#edit
user_password PATCH /user/password(.:format) devise/passwords#update
PUT /user/password(.:format) devise/passwords#update
POST /user/password(.:format) devise/passwords#create
cancel_user_registration GET /user/cancel(.:format) registrations#cancel
new_user_registration GET /user/sign_up(.:format) registrations#new
edit_user_registration GET /user/edit(.:format) registrations#edit
user_registration PATCH /user(.:format) registrations#update
PUT /user(.:format) registrations#update
DELETE /user(.:format) registrations#destroy
POST /user(.:format) registrations#create
destroy_user_session DELETE /sign_out(.:format) devise/sessions#destroy
new_user_session GET /sign_in(.:format) devise/sessions#new
user_session POST /sign_in(.:format) devise/sessions#create
new_user_profile GET /account/profile/new(.:format) profiles#new
edit_user_profile GET /account/profile/edit(.:format) profiles#edit
user_profile GET /account/profile(.:format) profiles#show
PATCH /account/profile(.:format) profiles#update
PUT /account/profile(.:format) profiles#update
DELETE /account/profile(.:format) profiles#destroy
POST /account/profile(.:format) profiles#create
new_user_test GET /account/test/new(.:format) tests#new
edit_user_test GET /account/test/edit(.:format) tests#edit
user_test GET /account/test(.:format) tests#show
PATCH /account/test(.:format) tests#update
PUT /account/test(.:format) tests#update
DELETE /account/test(.:format) tests#destroy
POST /account/test(.:format) tests#create
user_connections GET /account/connections(.:format) connections#index
POST /account/connections(.:format) connections#create
new_user_connection GET /account/connections/new(.:format) connections#new
edit_user_connection GET /account/connections/:id/edit(.:format) connections#edit
user_connection GET /account/connections/:id(.:format) connections#show
PATCH /account/connections/:id(.:format) connections#update
PUT /account/connections/:id(.:format) connections#update
DELETE /account/connections/:id(.:format) connections#destroy
new_user GET /account/new(.:format) users#new
edit_user GET /account/edit(.:format) users#edit
user GET /account(.:format) users#show
PATCH /account(.:format) users#update
PUT /account(.:format) users#update
DELETE /account(.:format) users#destroy
POST /account(.:format) users#create
how_it_works GET /how-it-works(.:format) home#how-it-works
sign_up GET /sign-up(.:format) home#sign-up
user_root GET /user(.:format) users#index
root GET / home#index
答
试图通过覆盖设计Registrations#new
方法,在您的注册控制器添加下面的方法:
def new
# Override Devise default behaviour and create a profile as well
build_resource({})
resource.build_profile
respond_with self.resource
end
还确保您已在路线中定义:
devise_for :users, controllers: {registrations: 'registrations'}
你能告诉我们表单代码吗? – Pavan
完成@Pavan,感谢您回复我 – Powderham