Devise - rejestracja

Witam.
Mam pewien problem przy modyfikacji rejestracji w Devise. Otóż chciałem dodać 2 dodatkowe pola ‘firstname’ i ‘lastname’

Dodałem do application controllera

before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :lastname) }
  end

parametry niby się zgadają

Parameters: {"utf8"=>"✓", "authenticity_token"=>"qag+rQcgNQMws5Yom6AGwwtFbN2X1jmcYJGXmQgE95Q=", "user"=>{"firstname"=>"B", "lastname"=>"K", "email"=>"mail2@mail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}

jednak firstname i lastname nie dodają się do bazy.

miałby ktoś pojęcie dlaczego tak się dzieje i jak to naprawić?

A czy napewno masz taką migrację w folderze ‘/db/migrate’ ?

class AddFieldsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :first_name, :string
    add_column :users, :last_name, :string
  end
end

innymi słowy czy dodałeś do tabeli users te dwa pola ?

tak, dodałem
schema:

create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "admin",                  default: false
    t.string   "firstname"
    t.string   "lastname"
  end

spróbuj:

before_filter :configure_permitted_parameters, if: :devise_controller?

dalej nic, ponadto zauważyłem że z poziomu konsoli wartości też się nie chcą zapisać.

2.1.5 :005 > a.firstname = "ASD"
     => "ASD" 
    2.1.5 :006 > a.lastname = "ZXC"
     => "ZXC" 
    2.1.5 :007 > a.save
       (0.5ms)  BEGIN
       (0.4ms)  COMMIT
     => true 
    2.1.5 :008 > a
     => #<User id: 11, email: "mail3@mail.com", 
...
04 00:24:02", updated_at: "2014-12-04 00:24:02", admin: false, firstname: nil, lastname: nil>

Trochę światła na tę sprawę rzuciłby Gemfile

source ‘https://rubygems.org

    gem 'rails', '4.1.8'
    
    gem 'pg'
    gem 'draper'
    gem 'decent_exposure'
    gem 'decent_decoration'
    gem 'devise'
    gem 'simple_form', '~> 3.1.0rc'
    gem 'bootstrap-sass', '~> 3.1.0'
    gem 'haml-rails'
    gem 'sass-rails', github: 'rails/sass-rails'
    gem 'coffee-rails'
    gem 'uglifier'
    gem 'quiet_assets'
    gem 'jquery-rails'
    gem 'therubyracer', platforms: :ruby
    gem 'travis'
    gem 'ffaker'
    gem 'konf'
    
    group :development do
      gem 'spring'
    end
    
    group :development, :test do
      gem 'rspec-rails'
      gem 'factory_girl_rails'
      gem 'shoulda-matchers'
      gem 'pry'
    end
    
    group :test do
      gem 'database_cleaner'
    end
    
    ruby '2.1.5'

Piszesz w pierwszym poście:

Mam pewien problem przy modyfikacji rejestracji w Devise.

i podajesz

…czyli dodajesz pola firstname i lastname tylko dla akcji rejestracja.
Sądzę, że skoro nie działa “modyfikowanie” już istniejącej rejestracji, to brakuje jednej linijki kodu:

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:firstname, :lastname, :email, :password, :password_confirmation) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:firstname, :lastname, :email, :password, :password_confirmation, :current_password) }
end

ale to chyba nie wyjaśnia dlaczego nie mogę z konsoli modyfikować tych pól?

a to nie jest tak że on widzi że nie ma admin
np. schema

ActiveRecord::Schema.define(version: 20141204071210) do

  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "name"
    t.string   "first_name"
    t.string   "last_name"
  end

. application controller - bez:name nie widzisz :first_name i :last_name

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :email, :password, :password_confirmation) }
  end

a jak dodam :name działa poprawnie

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :name, :email, :password, :password_confirmation) }
  end

udało mi się znaleźć problem.
okazało się że w modelu miałem

attr_accessor :firstname, :lastname

co blokowało modyfikowanie tych pól