2016-11-07 86 views
0

我是rails新手,試圖在設計註冊時使用嵌套形式爲設計用戶創建配置文件。我已經通過 Creating Profile for Devise users, Profile model for Devise users? 和其他一些文章來實現相同,但經過一天後,我仍然努力使其工作。這是我的代碼。如何爲設計用戶創建配置文件?

模型 - user.rb

class User < ActiveRecord::Base 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

模型 - user_profile.rb

class UserProfile < ActiveRecord::Base 
    belongs_to :user 
end 

控制器 - 控制器/用戶/ registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController 
    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) {|u| 
     u.permit(:email, :password, :password_confirmation, :remember_me, 
     user_profile_attributes: [:first_name, :last_name])} 
    end 
    end 
end 

視圖 - 視圖/設計/註冊/ new.html.erb

<h2>Sign up</h2> 
<% resource.build_user_profile %> 
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.email_field :email, autofocus: true %> 
    </div> 

    <div class="field"> 
    <%= f.label :password %> 
    <% if @minimum_password_length %> 
     <em>(<%= @minimum_password_length %> characters minimum)</em> 
    <% end %><br /> 
    <%= f.password_field :password, autocomplete: "off" %> 
    </div> 

    <div class="field"> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation, autocomplete: "off" %> 
    </div> 

    <%= f.fields_for :user_profile do |profile_form| %> 
    <%= profile_form.label :first_name %><br/> 
    <%= profile_form.text_field :first_name %><br/> 

    <%= profile_form.label :last_name %><br/> 
    <p><%= profile_form.text_field :last_name %><br/> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit "Sign up" %> 
    </div> 
<% end %> 

<%= render "devise/shared/links" %> 

服務器日誌

Processing by Devise::RegistrationsController#create as HTML 
    Parameters: {"utf8"=>"√", "authenticity_token"=>"rLuFXwISxiJpWPjpmKzjnjhKr41F5 
56sWbtT+8gslAMsFDWRbl7MSitSXUESjLdZccCBGBGvVv+JbhW7G5py5g==", "user"=>{"email"=> 
"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTER 
ED]", "user_profile_attributes"=>{"first_name"=>"Zeban", "last_name"=>"Dezend"}} 
, "commit"=>"Sign up"} 
Unpermitted parameter: user_profile_attributes 

我想,我失蹤的代碼來從PARAMS的值並創建一個新的記錄。有人可以建議我修復嗎?

+0

登記控制器只接受'user'參數。 你必須用你自己的方法來繼承和重寫這個控制器,這個方法也包含並允許'user_profile_attributes'。 [註冊控制器](https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb) – meshpi

回答

0

您是否嘗試過從他們的github頁面執行這些步驟? 他們在ApplicationController中設置允許的參數。這個結構也有點不同。參數進入keyshttps://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address

class ApplicationController < ActionController::Base 
    before_action :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def configure_permitted_parameters 
    added_attrs = [:username, :email, :password, :password_confirmation, :remember_me] 
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs 
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs 
    end 
end 
1

請按照下面的步驟。

色器件> REG>新

<div class="row"> 
      <div class="col-md-5 col-md-offset-4"> 

      <h2>Sign up</h2> 

      <% resource.build_user_profile if resource.user_profile.nil? %> 
      <%= form_for(resource, as: resource_name, url:  registration_path(resource_name)) do |f| %> 
      <%= devise_error_messages! %> 

      <div class="row"> 
      <%= f.fields_for :user_profile do |profile_form| %> 
      <div class="col-md-6"> 
      <div class="form-group"> 
      <%= profile_form.label :first_name %> 
      <%= profile_form.text_field :first_name, class: "form-control" %> 
      </div> 
      </div> 
      <div class="col-md-6"> 
      <div class="form-group"> 
      <%= profile_form.label :last_name %> 
      <%= profile_form.text_field :last_name, class: "form-control" %> 
      </div> 
      </div> 
      <% end %> 
      </div> 

      <div class="form-group"> 
      <%= f.label :email %><br /> 
      <%= f.email_field :email, autofocus: true, class: "form-control" %> 
</div> 

      <%= f.fields_for :user_profile do |profile_form| %> 
      <div class="form-group"> 
      <%= profile_form.label :business_name %> 
      <%= profile_form.text_field :business_name, class: "form-control" %> 
      </div> 
      <div class="form-group"> 
      <%= profile_form.label :business_category %> 
      <%= profile_form.collection_select :business_category_id, BusinessCategory.all, :id, :name, {prompt: "Select Category"}, {class: "form-control"} %> 
      </div> 
      <div class="form-group"> 
      <%= profile_form.label :website %> 
      <%= profile_form.url_field :website, class: "form-control" %> 
      </div> 
     <div class="form-group"> 
      <%= profile_form.label :address %> 
      <%= profile_form.text_area :address, class: "form-control" %> 
     </div> 
     <div class="form-group"> 
      <%= profile_form.label :personal_number %> 
      <%= profile_form.text_field :phone_number, class: "form-control" %> 
     </div> 


    <div class="form-group"> 
     <%= profile_form.label :office_number %> 
     <%= profile_form.text_field :office_number, class: "form-control" %> 

    </div> 
<% end %> 

<div class="form-group"> 
    <%= f.label :password %> 
    <% if @minimum_password_length %> 
    <em>(<%= @minimum_password_length %> characters minimum)</em> 
    <% end %><br /> 
    <%= f.password_field :password, autocomplete: "off", class: "form-control" %> 
</div> 

<div class="form-group"> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %> 
</div> 

<div class="actions"> 
    <%= f.submit "Sign up", class: "btn btn-primary" %> 
</div> 
<% end %> 

<%= render "devise/shared/links" %> 
</div> 
</div> 



user reg controller 

def new 
    # Override Devise default behaviour and create a profile as well 
    build_resource({}) 
    resource.build_user_profile 
    respond_with self.resource 
    end 

protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up) { |u| 
     u.permit(:email, :password, :password_confirmation, :user_profile_attributes => [:first_name, :last_name, :business_name, :business_category_id, :website, :address, :phone_number, :office_number]) 
    } 
    end 
相關問題