2013-04-30 7 views
39

Ich versuche, eine full_name Feld/Spalte meinem User-Modell hinzuzufügen (das devise gem verwenden) und Rails 4.Hinzufügen von benutzerdefinierten Feld/Spalte ersinnen mit Rails 4

Die meisten Beispiele Online recommend using attr_accessible, aber es scheint, dass dies in Rails 4 anders angegangen werden sollte.

Wie würde ich full_name zu meinem Benutzermodell hinzufügen? Ich konnte die Migration erfolgreich durchführen.

Datei: Migration> add_full_name_to_users

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

Datei: Registrierung> app/views/ersinnen/registration/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

Ist das zu: http://stackoverflow.com/questions/16471498/adding-extra-registration -Felder-mit-planen? –

+0

@dimitrismistriotis Ja, sieht aus wie das gleiche Problem. –

Antwort

66

Sobald Ihr Modell sein full_name Attribut hat, müssen Sie erlaubten Parameter für die #sign_up und # konfigurieren account_update Aktionen erstellen.

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

Arbeitete perfekt für mich. Vielen Dank! – Sparkmasterflex

+2

Wirklich thks! Muss in den Entwicklungsdokumenten enthalten sein! – DoctorRu

1

Starke Parameter für die Devise aktivieren statt attr_accessible. Dazu erstellen Sie einen neuen initiliazer mit diesem Inhalt:

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

Von devise Dokumentation:

Wenn Sie Ihre eigenen Ansichten anpassen, können Sie am Ende des Hinzufügen neue Attribute zu Formen. Rails 4 hat die Parameterbereinigung vom Modell zum Controller verschoben, was Devise veranlasst hat, dieses Problem auch auf dem Controller zu behandeln.

Sie sollten die URL unten überprüfen den Ansatz zu finden, die am besten Ihre Bedürfnisse passen: https://github.com/plataformatec/devise#strong-parameters

+0

Plus eine für einen Link zur Dokumentation – Sam

25

sollte diese Lösung arbeiten, mit sign_up und Update arbeiten:

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

Ich bekomme den Fehler 'undefined Methode '<<' für # ' – Sidhannowe

Verwandte Themen