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

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

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

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

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

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

Файл: Регистрация > приложение /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 %>
.
.
.

Ответ 1

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

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

Ответ 2

Это решение должно работать, работая с sign_up и обновлять:

  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

Ответ 3

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

При настройке собственных представлений вы можете добавить новые атрибуты в формы. Rails 4 переместил параметрическую дезинфекцию от модели к контроллеру, заставив Devise обрабатывать эту проблему и на контроллере.

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

Ответ 4

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

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