2013-04-30 12 views
39

Sto tentando di aggiungere un full_name campo/colonna per il mio modello utente (utilizzando il devise gemma) e Rails 4.Aggiungi campo personalizzato/colonna di elaborare con Rails 4

maggior parte degli esempi in linea recommend using attr_accessible, ma sembra che questo dovrebbe essere affrontato in modo diverso in Rails 4.

Come aggiungerei full_name al mio modello Utente? Sono stato in grado di eseguire correttamente la migrazione.

file: migrazione> add_full_name_to_users

class AddFullNameToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :full_name, :string 
    end 
end 

File: Registrazione> app/views/ideare/registrazione/new.html

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

    <%= f.label :full_name %> 
    <%= f.text_field :full_name, :autofocus => true %> 

    <%= f.label :email %> 
    <%= f.email_field :email %> 
. 
. 
. 
+0

È questo correlate a: http://stackoverflow.com/questions/16471498/adding-extra-registration -fields-with-idea? –

+0

@dimitrismistriotis Sì, sembra lo stesso problema. –

risposta

66

Una volta che il modello ha il suo attributo full_name, si dovrà configurare i parametri consentiti per la #sign_up e # account_update Crea azioni.

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

    protected 

    def configure_devise_permitted_parameters 
    registration_params = [:full_name, :email, :password, :password_confirmation] 

    if params[:action] == 'update' 
     devise_parameter_sanitizer.for(:account_update) do 
     |u| u.permit(registration_params << :current_password) 
     end 
    elsif params[:action] == 'create' 
     devise_parameter_sanitizer.for(:sign_up) do 
     |u| u.permit(registration_params) 
     end 
    end 
    end 

end 
+0

ha funzionato perfettamente per me. Grazie! – Sparkmasterflex

+2

Davvero! Deve essere incluso nei documenti di sviluppo! – DoctorRu

1

Abilitazione Parametri forti per Devise invece di attr_accessible. Per fare ciò, creare un nuovo initiliazer con quel contenuto:

DeviseController.class_eval do 
    def resource_params 
    unless params[resource_name].blank? 
     params.require(resource_name).permit(:email, :password, :password_confirmation, :remember_me) 
    end 
    end 
end 
12

Da documentazione testamentaria:

Quando si personalizza i propri punti di vista, si può finire per l'aggiunta di nuovi attributi di forme. Rails 4 ha spostato il parametro sanitizzazione dal modello al controller, facendo in modo che Devise gestisca questo problema anche sul controller.

Si dovrebbe controllare l'url qui sotto per trovare l'approccio che meglio si adattano alle vostre esigenze: https://github.com/plataformatec/devise#strong-parameters

+0

Più uno per includere un collegamento alla documentazione – Sam

25

Questa soluzione dovrebbe funzionare, lavorando con sign_up e aggiornamento:

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

    protected 

    def configure_permitted_parameters 
     devise_parameter_sanitizer.permit(:sign_up,  keys: [:full_name]) 
     devise_parameter_sanitizer.permit(:account_update, keys: [:full_name]) 
    end 
    end 
+1

Ricevo l'errore 'metodo non definito '<<' per # ' – Sidhannowe