允许带定制设计注册的嵌套属性的参数

问题描述:

在我的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 
+0

你能告诉我们表单代码吗? – Pavan

+0

完成@Pavan,感谢您回复我 – Powderham

试图通过覆盖设计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'} 
+0

感谢您的回复!不幸的是,这并没有改变错误信息。我在上面展示了我的路线。 – Powderham

+0

@Powderham:运行'rake routes'并在你的问题中更新 –

+0

完成@Gagan-Gami。 – Powderham