Обновление рельсов 4.2.8 до 5.0.x

#ruby-on-rails #json #ruby #render #upgrade

Вопрос:

Я нахожусь в процессе обновления своего старого приложения rails, созданного с rails 4.2.8 помощью to rails 5.0.x (пробовал версии rails 5.0.1 и 5.0.7 и столкнулся с той же проблемой).

Обновление приложения base rails прошло нормально, и мое приложение base rails работает нормально. Тем не менее, существует интерфейсное приложение, встроенное в angular, а также приложение, созданное с помощью nodejs, которое имеет некоторые каналы связи, такие как api, и некоторый контроллер для связи с приложением base rails.

У меня возникли проблемы с одним из этих контроллеров в режиме онлайн:

   render(:json =>  result, methods: [:mdobjectsAttributes, :blockAttributes, :entityFormTemplateBlock], :status => 200, :errorCode => 0, :layout => false)
 

Ошибка в том, что:

 NoMethodError (undefined method `mdobjectsAttributes' for #Formtemplateblock:0x000055d7ff2a6480>):
 

Итак, я знаю, что мне нужно обновить/изменить функцию attr_accessible и attr_protected в пользу надежных параметров. И я вижу их в моделях, но я не уверен, что это имеет эффект даже для всего response methods или около того… Я обновил модели, чтобы использовать ApplicationRecord их вместо ActiveRecord::Base этого .

Кроме того, я обновился jbuilder до последней версии 2.11.x .

Итак, есть ли какие-либо предложения по решению? Очевидно, я что-то упускаю?

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Вот предварительный просмотр моделей и контроллера, где отображаются ошибки.

Комментарии:

1. Это не имеет ничего общего с Сильными параметрами. Строгие параметры используются только для занесения входящих параметров в белый список для массового назначения экземплярам модели при создании и обновлении ресурсов. Это совсем не относится к рендерингу в формате JSON. На самом деле довольно трудно сделать какой-либо вывод, поскольку мы понятия не имеем, откуда :mdobjectsAttributes, :blockAttributes они вообще должны взяться и почему название так не похоже на рубиновое.

2. унаследованный проект… там так все запутано.. и я пытаюсь обновить версии ruby с 2.4.2 до 2.5.1 и rails с 4.2.8 до 5.xx …. проделана большая работа, и базовое приложение отлично работает, всего несколько контроллеров и действий, которые выглядят так, как описано выше. Внезапно метод отсутствует, если я верну код к предыдущим версиям, он будет работать хорошо..

3. Если вы сделали ветви в git, я бы спрятал или зафиксировал ваши изменения, а затем проверил, какой тег/ветвь работал, и нашел соответствующий метод. Github также очень полезен для этого. camelCase говорит мне, что, скорее всего, это какой-то код приложения, а не драгоценный камень или фреймворк, и поэтому на него можно ответить только с учетом указанного кода.

4. Да, я использую ветви. И приложение является частью настройки docker. Итак, когда я меняю ветки на более старую версию кода, это работает хорошо, просто в ветке, где я уже сделал некоторое обновление ruby и rails, у меня возникла проблема.

5. @max здесь также представлен предварительный просмотр моделей, упомянутых в разделе ошибка и контроллер.

Ответ №1:

После 2-3 дней изучения проблемы мне удалось исправить ее, добавив отсутствующие методы в требуемую модель в качестве attr_accessor следующим образом:

 attr_accessor  :blockAttributes, :entityFormTemplateBlock...
 

Поскольку у меня были проблемы в 15 моделях, мне пришлось оптимизировать свое исправление, создав модуль ruby и включив его в требуемые модели.

Образец модуля в rails app/lib/custom_attr_accessors.rb

 module CustomAttrAccessors
    attr_accessor  :blockAttributes, :entityFormTemplateBlock..
end
 

и, наконец, включите этот модуль в модель:

 class Formtemplate < ApplicationRecord
  include CustomAttrAccessors
.....