ruby-on-rails - 用于有条件显示字段的 Rails 模式

标签 ruby-on-rails design-patterns ruby-on-rails-4

我发现自己一遍又一遍地重复这种类型的代码。

<% if <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c0d6c4143484940025c5e435c495e5855024e404d4247" rel="noreferrer noopener nofollow">[email protected]</a>? %>
    <label>Property</label>
    <div><%= @model.property %></div>
<% end %>

目标是当且仅当值存在时才输出标签和属性值。我发现多次重复这段代码会导致很难扫描源代码。可以减少并使其更简洁吗?可以应用什么模式来简化编码?

最佳答案

您可以为您创建一个助手,它将自动处理这些测试:

# application helper
def display_if_exists(instance, attribute)
  return nil if instance.blank? || attribute.blank?

  label_tag = content_tag :label do
    instance.class.human_attribute_name attribute.to_sym
  end

  div_tag = content_tag :div do
    instance.try(attribute.to_sym)
  end

  return (label_tag + div_tag).html_safe
end

并以这种方式使用它:

# view
display_if_exists(@user, :username)

一点改进,有选项:

def display_if_exists(instance, attribute, options = {})
  return nil if instance.blank? || attribute.blank?

  label_options = options.delete(:label)
  div_options = options.delete(:div)

  label_tag = content_tag :label, label_options do
    instance.class.human_attribute_name attribute.to_sym
  end

  div_tag = content_tag :div, div_options do
    instance.try(attribute.to_sym)
  end

  return (label_tag + div_tag).html_safe
end

并使用如下选项:

display_if_exists(@user, :username, { label: { class: 'html-class' }, div: { style: 'margin-top: 2px;' } })

另一个选项是 Rails Presenter 模式。它非常有趣,但对于您想要实现的目标来说可能太深了:

关于ruby-on-rails - 用于有条件显示字段的 Rails 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22794137/

相关文章:

ruby-on-rails - 如果 Rails 中 2 个模型中的一个更新失败,则回滚

mysql - sqlite3 的迁移中断,但在 mysql2 中运行

ruby-on-rails - 回形针:一个模型中有多个 "has_attached_file"

ruby-on-rails - 将 Rails Generator 作为 Ruby Gem 分发

design-patterns - 温莎城堡以及如何避免服务定位器模式?

c# - 领域驱动设计 : Manager and service

ruby-on-rails - 如何通过接受嵌套属性的关联为多对多创建新记录?

ruby-on-rails - 不同用户的 Action Controller Live

java - java.util.logging.Logger.log() 是责任链模式吗?

jquery - Rails 中的多选