LoadLibrary
上述代码只能通过调用- 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
答案 0 :(得分:1)
通常不建议在视图中分配变量。但是,在这种情况下,您可以使用通常被接受的内联赋值(只要您将使用范围保留在条件块的上下文中):
Dequeu<int> i;
另一个解决方案是记住函数内部的值。
if (intro = clean_book_intro_component(:literary_works)).present?
%h2 Other Books Related to #{@book.title}
%p.fact-text
= intro
但是,只要存在对实例的引用,这将导致解释器保留数据。因此,建议仅在执行成本高昂和/或要记忆的数据有限的非常特殊情况下使用。
此外,如果帮助者接受参数,则需要一些额外的复杂性。事实上,您最终会记忆一些与可能的参数输入呈线性关系的数据。
答案 1 :(得分:1)
- clean_book_intro_component(:literary_works).tap do |cbic|
- if cbic.present?
%h2 Other Books Related to #{@book.title}
%p.fact-text
= cbic
也许我的haml错了,但想法是使用tap
而不是显式保存调用的结果
答案 2 :(得分:0)
是的,只需将clean_book_intro_component(:literary_works)
的结果保存在变量中,然后使用该变量而不是调用该函数。
答案 3 :(得分:0)
您可以将视图移动到局部并调用集合上的局部视图。如果集合为空,则不会呈现任何内容。类似的东西:
# 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)]
请参阅有关rendering collections的Rails指南。