- if clean_book_intro_component(:literary_works).present?
  %h2 Other Books Related to #{@book.title}
  %p.fact-text
    = clean_book_intro_component(:literary_works)

Можно ли написать код выше, вызвав clean_book_intro_component(:literary_works) только один раз?

Реализация clean_book_intro_component

def clean_book_intro_component(component)
  sanitize @book.intro.send(component), tags: %w(span b i p a), attributes: %w(id class style href)
end
2
Bhushan Lodha 5 Янв 2016 в 12:06

4 ответа

Лучший ответ
- clean_book_intro_component(:literary_works).tap do |cbic|
  - if cbic.present?
    %h2 Other Books Related to #{@book.title}
    %p.fact-text
      = cbic

Возможно, я ошибся, но идея состоит в том, чтобы использовать tap вместо явного сохранения результата вызова

1
Damiano Stoffie 5 Янв 2016 в 10:09

Да, просто сохраните результат clean_book_intro_component(:literary_works) в переменной, а затем используйте эту переменную вместо вызова функции.

0
pablochan 5 Янв 2016 в 09:13

Вы можете переместить представление в партиал и вызвать партиал в коллекции. Если коллекция пуста, ничего не отображается. Что-то типа:

# a related_books partial
%h2 Other Books Related to #{@book.title}
  %p.fact-text
    = related_books


# in the calling view
= render partial: related_books, collection: [clean_book_intro_component(:literary_works)]

См. Руководство Rails о рендеринге коллекций.

0
spickermann 5 Янв 2016 в 09:51

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

if (intro = clean_book_intro_component(:literary_works)).present?
  %h2 Other Books Related to #{@book.title}
  %p.fact-text
    = intro

Другое решение - запомнить значение внутри функции.

def clean_book_intro_component(component)
  @component ||= {}
  @component[component] ||= sanitize @book.intro.send(component), tags: %w(span b i p a), attributes: %w(id class style href)
end

Однако это приведет к тому, что интерпретатор сохранит данные до тех пор, пока существует ссылка на экземпляр. Следовательно, это рекомендуется только в очень особых случаях, когда выполнение является дорогостоящим и / или данные для мемоизации ограничены.

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

1
Simone Carletti 5 Янв 2016 в 09:19