Хобрук: Ваш путь к мастерству в программировании

Добавление настраиваемых полей в регистрацию Devise — Ruby on Rails 4 и Devise 3

Hi, I have a model Coach that I'm trying to add specific fields to. I have created a migration and added the fields to the registration but receive the error NoMethodError in Devise::Registrations#new & undefined method `first_name' for

Thank You for taking a look at this...
Update: I have already migrated the database Here is what my code looks like thus far:

Регистрация

Зарегистрируйтесь как тренер

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


  <div><%= f.label :first_name %><br />
  <%= f.text_field :first_name, autofocus: true %></div>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true %></div>

  <div><%= f.label :password %><br />
    <%= f.password_field :password, autocomplete: "off" %></div>

  <div><%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %></div>

  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render "coaches/shared/links" %>

Миграция

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

Схема

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

  create_table "coaches", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    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"
  end

  add_index "coaches", ["email"], name: "index_coaches_on_email", unique: true
  add_index "coaches", ["reset_password_token"], name: "index_coaches_on_reset_password_token", unique: true

  create_table "players", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    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"
  end

  add_index "players", ["email"], name: "index_players_on_email", unique: true
  add_index "players", ["reset_password_token"], name: "index_players_on_reset_password_token", unique: true

  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"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

Обратный след

Started GET "/coaches/sign_up" for 127.0.0.1 at 2014-06-27 00:50:41 -0400
Processing by Devise::RegistrationsController#new as HTML
  Rendered coaches/registrations/new.html.erb within layouts/application (1.7ms)
Completed 500 Internal Server Error in 6ms

ActionView::Template::Error (undefined method `first_name' for #<Coach:0x007f9f874d6510>):
     5:     
     6:     
     7:   <div><%= f.label :first_name %><br />
     8:   <%= f.text_field :first_name, autofocus: true %></div>
     9:   
    10:   <div><%= f.label :email %><br />
    11:   <%= f.email_field :email, autofocus: true %></div>
  app/views/coaches/registrations/new.html.erb:8:in `block in _app_views_coaches_registrations_new_html_erb__1603382164571940584_70161540751300'
  app/views/coaches/registrations/new.html.erb:3:in `_app_views_coaches_registrations_new_html_erb__1603382164571940584_70161540751300'


  Rendered /Users/noahreisch/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.3ms)
  Rendered /Users/noahreisch/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.9ms)
  Rendered /Users/noahreisch/.rvm/gems/ruby-2.1.1/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (9.8ms)
27.06.2014

  • вы перенесли таблицу? rake db:migrate 27.06.2014
  • @WaliAli Да, я так и сделал. 27.06.2014
  • сначала убедитесь, что поля были добавлены в таблицу тренеров, проверив схему или rails c. это то, что вы разместили выше, одно сообщение об ошибке или две разные ошибки? Я заметил &. Я только что добавил first_name в таблицу devise User (rails 4), просто запустив миграцию, и это сработало. добавьте сильные параметры, как предложено в ответе ниже. 27.06.2014
  • Можете ли вы представить класс модели для пользователя? Почему миграция называется ...Coach, а таблица - пользователи 27.06.2014
  • Нет модели User, строго Coach.rb, потому что есть другая отдельная модель Player.rb — я изменил миграцию с add_column :users, :first_name, :string на => add_column :coaches, :first_name, :string. Однако изменений не было. Что касается ошибки. Ошибка - неопределенный метод `first_name' 27.06.2014
  • И показать полную трассировку 27.06.2014
  • проследить? Ошибка, выдаваемая терминалом? 27.06.2014
  • Вы написали: NoMethodError в Devise::Registrations#new & undefined method `first_name' for... Мне нужно что-то, что после for 27.06.2014
  • Да, например, ошибка была связана с регистрацией Devise в результате неопределенного метода 'first_name'? Что я не понимаю? 27.06.2014
  • да, обратная трассировка - это ошибка, выдаваемая терминалом. вы можете отредактировать свой вопрос и включить его. также опубликуйте таблицу из схемы (db/schema.rb). 27.06.2014
  • У вас есть базовый класс для пользователей? В идеале у вас должен быть класс User, а класс Player и Coach должны быть унаследованы от User. 27.06.2014
  • @MaxKonin хорошо обновил информацию 27.06.2014
  • У вас есть 3 табеле игрока, диваны и пользователи, но добавлено поле только для пользователей 27.06.2014
  • Изначально у меня была пользовательская модель, но я уничтожил эту модель и выбрал две отдельные модели, потому что у них будут довольно контрастные поля. Что вы подразумеваете под добавленными полями только для пользователей? Я добавил класс AddFieldsToCoaches ‹ ActiveRecord::Migration def change add_column :coaches, :first_name, :string add_column :coaches, :last_name, :string end end 27.06.2014
  • @MaxKonin Что вы подразумеваете под игроками и тренерами Remove Tables, можете ли вы уточнить? И с этой методологией я все еще смогу иметь отдельную регистрационную форму для игрока и тренера? 27.06.2014
  • @MaxKonin Я искренне ценю, что вы уделили время этому моему вопросу. Тем не менее, я чувствую себя немного затопленным всеми различными подходами. Не могли бы вы просто дать упрощенный подход к тому, где я могу иметь отдельные регистрационные формы для тренера и игрока, в то же время имея возможность настраивать их регистрацию. Еще раз спасибо. 27.06.2014
  • Для отдельной регистрационной формы для игрока и тренера вы должны использовать вид с ограниченной областью действия (github.com/plataformatec/devise# настройка представлений) 27.06.2014
  • Хорошо, я пойду дальше и буду следить за этим, еще раз спасибо. 27.06.2014

Ответы:


1

Может быть проблема с сильными параметрами. Попробуйте добавить следующий код в application_controller.rb.

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :first_name
  end
end

Для получения дополнительной информации: https://github.com/plataformatec/devise#strong-parameters.

27.06.2014
  • Я считаю, что это может быть проблема с сильными параметрами, но добавление этого в ApplicationController не помогло! Любые другие идеи? 27.06.2014
  • @NJay: вы также добавили эти параметры в модель ?? 27.06.2014

  • 2

    Измените свои модальные окна: 1. Создайте базовый класс User.

    class User < ActiveRecord::Base
      #configs for devise
    end
    
    1. Наследовать диван и игроков от пользователя

      class Player < User; end

      class Couch < User; end

    2. Удалить игроков Tables и кушетки

      drop_table : игроки

    Если вы не хотите использовать STI. Вы можете использовать MTI, но это не очень хороший способ.

    В route.rb можно добавить отдельные маршруты девайсов для диванов и игроков:

    devise_for :couchs, :players
    

    Но лучше всего использовать STI

    27.06.2014
  • Что вы имеете в виду, говоря об удалении игроков и тренеров, можете ли вы уточнить? И с этой методологией я все еще смогу иметь отдельную регистрационную форму для игрока и тренера? 27.06.2014
  • Для отдельной регистрационной формы для игрока и тренера вы должны использовать вид с ограниченной областью действия (github.com/plataformatec/devise#configuring-views). 27.06.2014
  • заработало, удалив таблицу пользователей в схеме, а рельсы уничтожили пользователя разработки, а затем, как вы сказали, добавление методов в контроллер приложения! 27.06.2014

  • 3
    ActionView::Template::Error (undefined method `first_name' for #<Coach:0x007f9f874d6510>):
    

    эта ошибка говорит вам, что first_name не является атрибутом Coach.

    Как видно из опубликованного вами schema, в coaches table нет поля first_name. так что это означает, что вы неправильно добавили first_name в таблицу.

    чтобы добавить поле в таблицу, сделайте следующее:

    rails g migration AddFirstNameToCoach first_name:string

    затем запустите rake db:migrate

    затем реализуйте ответ @MaxKonin о разрешении дополнительных параметров

    class ApplicationController < ActionController::Base
     before_action :configure_permitted_parameters, if: :devise_controller?
    
     protected
    
       def configure_permitted_parameters
       devise_parameter_sanitizer.for(:sign_up) << :username
      end
    end
    
    27.06.2014

    4

    И вы должны сделать то же самое для sign_in и account_update

    Контроллер приложений

    before_filter :configure_permitted_parameters, if: :devise_controller?
    
    def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :email, :password, :password_confirmation) }
    end
    
    27.06.2014
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..