用于有条件地显示字段的Rails模式

时间:2014-04-01 18:37:39

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

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

<% if !@model.property.blank? %>
    <label>Property</label>
    <div><%= @model.property %></div>
<% end %>

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

2 个答案:

答案 0 :(得分:3)

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

# 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 Pattern。这非常有趣,但可能对你想要达到的目标而言太深了:

答案 1 :(得分:0)

可能您希望将其解压缩为辅助方法,您可以在其中放置现有逻辑并调用该帮助程序。

def print_property_if_present(model)
  "<label>Property</label><div>#{model.property}</div>" if model.property.present?
end

请勿忘记调用html_safe以HTML可打印格式呈现输出。 希望这有帮助!