Метод перезаписи в модуле Ruby - PullRequest
0 голосов
/ 12 июля 2020

В Spina есть класс Account

В котором вызывается метод:

serialized_attr_accessor :google_analytics, :google_site_verification, :facebook, :twitter, :instagram, :youtube, :linkedin, :google_plus, :theme

Я создал Модуль Spina с class Account в моем каталоге / app / models / spina с абсолютно тем же кодом, что и в модели учетной записи gem, единственная строка, которая была изменена, была:

serialized_attr_accessor :google_analytics, :google_site_verification, :facebook, :twitter, :instagram, :youtube, :linkedin, :twitch, :github, :theme

(в основном добавлено еще 2 атрибута)

Я более чем уверен, что это неправильный подход и незнание того, как мысли работают в Rails. Буду рад предоставить информацию, какое здесь решение / подход.

PS Новое в Ruby и Rails, поэтому будьте очень строги в ответах.

Обновить 12.07.20-1 Создал патч обезьяны:

~ / app / models / spina / account.rb

module Spina
  class Account < ApplicationRecord
    # here putted all code from [Account](https://github.com/SpinaCMS/Spina/blob/master/app/models/spina/account.rb)
  end
end

1 Ответ

1 голос
/ 12 июля 2020

Заявление об ограничении ответственности: я сам не использовал Spina и не знаю его проекта.

Это не столько вопрос Rails, сколько о геме и о том, как его авторы предполагали его настраивать.

При просмотре кода драгоценного камня здесь (строки 16-29) выясняется, что serialized_attr_accessor - это метод класса Spina::Account, который перебирает каждый предоставленный аргумент и добавляет методы получения и установки. динамически.

В общем, вы правы, что в Rails вы можете добавить файл app/models/spina/account.rb и повторно открыть класс. Однако это не отменяет определение класса в других файлах. Следовательно, исходный вызов serialized_attr_accessor по-прежнему вызывается - вы не можете игнорировать его в данном конкретном случае.

Пока вы хотите добавить атрибуты, а не удалять их, вы можете выполнить следующий код, и он должен иметь желаемое поведение. Вы можете поместить этот код в инициализатор (например, под config/initializers/spina.rb - все файлы под config/initializers запускаются в алфавитном порядке как часть процесса загрузки Rails):

Spina::Account.serialized_attr_accessor :twitch, :github

Однако, хотя это исправление может работать для вас сегодня, если авторы Spina не указали, что эта расширяемость поддерживается как часть интерфейса гема, то вы рискуете, что завтра (точнее - в следующем выпуске Spina) он может сломаться. Вполне возможно, что авторы никогда не предполагали, что serialized_attr_accessor будет опубликован c, и могут переименовать / удалить / изменить его поведение в следующей версии, что нарушит ваше приложение.

Вообще говоря, открытие классов ( называется «обезьяна исправления») и вызов не-publi c методов (или непредусмотренных интерфейсов) - это практика, которую следует использовать с осторожностью, даже если это можно сделать в Ruby, поскольку вы связываете свой код с реализацией драгоценного камня .

Еще одна вещь, на которую следует обратить внимание для этого «исправления». Эти два добавленных вами атрибута не сохраняются в базе данных. Они хранятся только в памяти. Я не уверен, сохранились ли какие-либо другие поля, поскольку я не знаком с драгоценным камнем. Но если вам нужно, чтобы они были постоянными, вам нужно будет добавить миграцию в Rails. Вы можете создать миграцию для изменения таблицы spina_accounts, но это звучит как плохая идея, поскольку она сильно связывает ваше приложение с их реализацией. Вы также можете создать свою собственную таблицу accounts, которая расширяет учетную запись Spina, ссылаясь на запись учетной записи (например, spina_account_id) и добавляя необходимые вам дополнительные поля.

В любом случае, я предлагаю открыть на странице github гемма и спросите, поддерживают ли они официально возможность настройки атрибутов учетной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...