Преобразовать параметр типа rails STI в фактическую константу класса?

Я новичок в рельсах. Я создаю STI со следующими class User и его class Teacher < User подклассами. Выдает ошибку при заполнении пользовательской формы.

Ошибка имени в /users

неинициализированная константа User::teacher

app/controllers/users_controller.rb, строка 29

   24     end
   25   
   26     # POST /users
   27     def create 
   28       byebug 
>  29       @user = User.new(user_params) 
   30       authorize @user    
   31       if @user.save
   32         render json: @user, status: :created, location: @user, serializer: UserSerializer
   33       else
   34         render json: @user.errors, status: :unprocessable_entity

Отслеживание приложения

  • app/controllers/users_controller.rb:29:в `создать'

Полная трассировка

activerecord (6.0.1) lib/active_record/inheritance.rb:206:in    `compute_type'
activerecord (6.0.1) lib/active_record/inheritance.rb:233:in `find_sti_class'
activerecord (6.0.1) lib/active_record/inheritance.rb:263:in `subclass_from_attributes'
activerecord (6.0.1) lib/active_record/inheritance.rb:56:in `new'
app/controllers/users_controller.rb:29:in `create'
actionpack (6.0.1) lib/action_controller/metal/basic_implicit_render.rb:6:in    `send_action'
actionpack (6.0.1) lib/abstract_controller/base.rb:196:in `process_action'
actionpack (6.0.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (6.0.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (6.0.1) lib/active_support/callbacks.rb:135:in `run_callbacks'
actionpack (6.0.1) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (6.0.1) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (6.0.1) lib/action_controller/metal/instrumentation.rb:33:in `block in    process_action'
activesupport (6.0.1) lib/active_support/notifications.rb:180:in `block in instrument'
activesupport (6.0.1) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport (6.0.1) lib/active_support/notifications.rb:180:in `instrument'
actionpack (6.0.1) lib/action_controller/metal/instrumentation.rb:32:in `process_action'
actionpack (6.0.1) lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
activerecord (6.0.1) lib/active_record/railties/controller_runtime.rb:27:in    `process_action'
actionpack (6.0.1) lib/abstract_controller/base.rb:136:in `process'
actionpack (6.0.1) lib/action_controller/metal.rb:191:in `dispatch'
actionpack (6.0.1) lib/action_controller/metal.rb:252:in `dispatch'
actionpack (6.0.1) lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
actionpack (6.0.1) lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack (6.0.1) lib/action_dispatch/journey/router.rb:49:in `block in serve'
actionpack (6.0.1) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (6.0.1) lib/action_dispatch/routing/route_set.rb:837:in `call'

Я предполагаю, что мне не хватает части константы строкового параметра для фактической константы класса. Как это сделать?

Пожалуйста, направляйте. Спасибо


person Khu li fang    schedule 09.12.2019    source источник


Ответы (2)


Убедитесь, что у вас есть тип в базе данных, также посмотрев на uninitialized constant User::teacher, похоже, вы где-то используете более низкую версию. Должно быть User::Teacher

person Paulo Fidalgo    schedule 10.12.2019
comment
рельсы -v 6.0.1 и рубин -v 2.6.5. User::Teacher значит ли это, что я должен использовать модель пространства имен и контроллер? а еще config.load_paths << "#{RAILS_ROOT}/app/models/users" - person Khu li fang; 10.12.2019
comment
resources :teachers, controller: 'users', type: 'Teacher' в маршрутах. И scope :teachers, -> { where(role: 'Teacher') } в пользовательской модели - person Khu li fang; 10.12.2019

как сказала Паула Фидальго, чтобы убедиться, что у вас есть столбец типа в виде строки в схеме модели пользователя.

после этого вы можете создавать новые записи в модели пользователя, как показано ниже.

Teacher.create(user_params)

User.create(type: 'Teacher')

оба одинаковы.

person Neel Tandel    schedule 04.01.2020