Добавить пользовательское поле/столбец в Devise с помощью Rails 4

Я пытаюсь добавить поле/столбец full_name в свою модель пользователя (используя драгоценный камень devise) и Rails 4.

Большинство примеров онлайн рекомендует использовать attr_accessible, но похоже, что в Rails 4 к этому нужно подходить по-другому.

Как мне добавить full_name в мою модель пользователя? Мне удалось успешно выполнить миграцию.

Файл: Миграция > add_full_name_to_users

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

Файл: Регистрация > app/views/devise/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 %>
.
.
.

person Neil Kelty    schedule 30.04.2013    source источник
comment
Связано ли это с: stackoverflow.com/questions /16471498/ ?   -  person Dimitrios Mistriotis    schedule 26.05.2013
comment
@dimitrismistriotis Да, похоже, та же проблема.   -  person Neil Kelty    schedule 06.06.2013


Ответы (4)


Как только ваша модель получит атрибут full_name, вам нужно будет настроить разрешенные параметры для действий #sign_up и #account_update Devise.

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
person Y3mSHF    schedule 20.07.2013
comment
Работал отлично для меня. Спасибо! - person Sparkmasterflex; 01.05.2014

Это решение должно работать при работе с sign_up и update:

  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
person yozzz    schedule 24.12.2013
comment
Я получаю сообщение об ошибке undefined method '<<' for #<ActionController::Parameters:0x007fdd5919c768> - person Sidhannowe; 10.02.2014

Из документации по разработке:

Когда вы настраиваете свои собственные представления, вы можете добавлять в формы новые атрибуты. В Rails 4 санация параметров была перенесена из модели в контроллер, в результате чего Devise решил эту проблему и на контроллере.

Вы должны проверить приведенный ниже URL-адрес, чтобы найти подход, который лучше всего соответствует вашим потребностям: https://github.com/plataformatec/devise#strong-parameters

person Leo    schedule 16.07.2013
comment
Плюс один за включение ссылки на документацию - person Sam; 25.11.2014

Включите сильные параметры для Devise вместо attr_accessible. Для этого создайте новый инициализатор с этим содержимым:

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
person mouhcine    schedule 14.07.2013