仅显示Ruby on Rails中包含内容的字段

时间:2014-11-14 12:25:04

标签: ruby-on-rails ruby ruby-on-rails-3 model logic

我有一个具有产品型号且产品具有以下属性的应用程序:

t.string :name
t.string :info
t.string :purpose
t.string :properties_sheen
t.string :properties_color
t.string :properties_solids
t.string :properties_coverage
t.string :properties_thickness
t.string :properties_flashpoint
t.string :properties_voc
t.string :application_ratio
t.string :application_thinner
t.string :application_method
t.string :application_cleaning
t.string :conditions_touch_5
t.string :conditions_touch_23
t.string :conditions_touch_30
t.string :conditions_hard_5
t.string :conditions_hard_23
t.string :conditions_hard_30
t.string :conditions_refloatation
t.string :conditions_interval_min_5
t.string :conditions_interval_min_23
t.string :conditions_interval_min_30
t.string :conditions_interval_max
t.string :coating_spec
t.string :surface_prep
t.string :storage
t.string :pack_size

在产品页面上,这些属于组。例如,属性包含具有'属性_'的所有属性。等等。

对于我来说,除了应用' .present之外,仅显示具有内容的字段的最佳方式是什么?'每个属性的逻辑?

我为小组创建了一些产品帮助程序,试图删除没有内容的完整部分,但这对我来说似乎并非如此,所以我相信这是一个更好的方法。

def any_applications_present?
  unless @product.application_ratio.present? || @product.application_thinner.present? || @product.application_method.present? || @product.application_cleaning.present?
    return false
  else
    return true
  end
end

鉴于该应用程序非常简单,最多可能包含20个产品,我非常希望保持后端同样简单,将所有内容存储在单个产品表中。

真的很感激任何建议:)

**** Example from the Products Show View *****

.row
  .col-sm-12
     %h3
       Properties
     %p
       Sheen:
       %span
         = @product.properties_sheen
     %p
       Color:
       %span
         = @product.properties_color

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

# in product.rb
def has_applications?
  [:ratio, :thinner, :method, :cleaning].any? do |method|
    send("application_#{method}").present?
  end
end

然后在您的模型上调用它:

@product.has_application? # returns true or false

答案 1 :(得分:1)

一种方法是在显示之前过滤属性。例如,在控制器中:

@product = Product.first

在视图中:

.row
  .col-sm-12
     - @product.attributes.except('id', 'ctreated_at', 'updated_at').select{|attr, value| value == false || !value.blank? }.each do |attribute|
      %h3
        = attribute.humanize
      %span
         = @product[attribute]

Product class:

中创建实例方法
def available_attributes
  self.attributes.except('id', 'ctreated_at', 'updated_at').select{|attr, value| value == false || !value.blank? }
end

现在查看可以是:

.row
  .col-sm-12
     - @product.available_attributes.each do |attribute|
      %h3
        = attribute.humanize
      %span
         = @product[attribute]

当然,你必须在这里做一些CSS样式。

此外,在attribute使用I18nI18n.t(attribute)的位置获取您要显示的值:

en:
  properties_sheen: 'Sheen'
  properties_color: 'Color'