Мутирующий список экземпляров объектов в Rails - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь очистить свой взгляд, перемещая метод дезинфекции Rails к помощнику, но он не дает желаемого результата.Ниже показано, как выглядит мое действие индекса.Я знаю, что это уродливо и не очень ООП, но я упростил его, чтобы я мог следить за тем, что происходило при отладке.

Я пытаюсь перебрать все атрибуты источников, запустить дезинфицирующее средство для любого атрибута, который является непустой строкой, заменить исходные строки очищенными строками (transform_values!) И записать поверх оригинала@sources (карта!).

Я пытался сохранить их в переменных, отличных от @sources, и использовать .each вместо .map!, но очищенные значения не позволяют.

def index
  @sources = Source.all
  @sources.map! { |source| 
    source.attributes.transform_values! { |attr|
      attr.blank? || !attr.is_a?(String) ? attr 
      : ActionController::Base.helpers.sanitize(attr) } }
end

Однако, после изучения моего списка источников в представлении, он удаляет экземпляры источников и вместо этого возвращает необъявленный массив хэшей.Я могу просмотреть их, но не могу назвать определенные атрибуты, такие как source.author, что не очень хорошо.

Вот несколько изображений для справки.Первый - это то, как он должен выглядеть, а второй - то, что я сейчас получаю

Незанизированные источники

Санитарные источники

1 Ответ

0 голосов
/ 09 октября 2018

map! заменяет каждый элемент в массиве результатом блока.Это не то, что вы собираетесь делать, потому что вы просто хотите изменить элементы, а не заменить их чем-то другим.Использование простого each вместо map! поможет.

С другой стороны, санитарная обработка фактически является обязанностью представления (поэтому оно определено в помощнике).Если вам часто приходится проводить санитарную обработку с одним и тем же аргументом, определите свой собственный помощник:

class ApplicationHelper
  def sany(str)
    sanitize(str, %w[...])
  end
end

<%= sany(source.some_attr) %>

Вы также можете установить параметры очистки по умолчанию, следуя документации:

# In config/application.rb
config.action_view.sanitized_allowed_tags = ['strong', 'em', 'a']
config.action_view.sanitized_allowed_attributes = ['href', 'title']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...