我有一个具有产品型号且产品具有以下属性的应用程序:
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
答案 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
使用I18n
:I18n.t(attribute)
的位置获取您要显示的值:
en:
properties_sheen: 'Sheen'
properties_color: 'Color'