您好我有一个组织模型,它接受地址模型的嵌套属性。一切都运转良好,但是当我尝试显示地址时,到目前为止我想出的最好的是: -
<%= "#{@organisation.address.line1} #{@organisation.address.line2} #{@organisation.address.line3} #{@organisation.address.line4} #{@organisation.address.postcode} #{@organisation.address.country}" %>
这样可行,但不会在字段之间添加逗号。我可以手动添加逗号,但如果地址没有line4等,那看起来很傻。
有没有更简单的方法来执行此操作,以便地址显示如下,并且如果字段为空,则不会在字段后添加逗号(并且还会在最后一个字段后添加句点)?
The address, the road, the postcode, the country.
感谢您寻找
修改
感谢所有建议。我将尝试在应用程序控制器上创建一个可以从任何视图调用的辅助方法,因为地址模型被多个其他模型使用。
答案 0 :(得分:2)
<%= [@organisation.address.line1, @organisation.address.line2, @organisation.address.line3, @organisation.address.line4, @organisation.address.postcode, @organisation.address.country].reject(&:blank?).join(", ") %>
最好将它移动到帮助器
答案 1 :(得分:1)
你可以这样:
<%= "#{@organisation.address.line1},#{@organisation.address.line2},\
#{@organisation.address.line3},#{@organisation.address.line4},\
#{@organisation.address.postcode},#{@organisation.address.country}".
gsub(/,+/,",").gsub(/(\A,)|(,\Z)/,'')%>
这样你就可以杀死双逗号以及出现在字符串
开头或结尾的任何逗号答案 2 :(得分:1)
@Vimsha答案是正确的,但是,我会更进一步,覆盖地址模型上的to_string
方法:
def self.to_s
[line1, line2, line3, line4, postcode, country].reject(&:blank?).join(", ")
end
然后您可以在视图上轻松调用它:
<%= @organization.address.to_s %>
编辑:您要覆盖to_s
,而不是to_string
答案 3 :(得分:1)
对于特定于视图的方法,请考虑使用装饰器。您添加了一层装饰器并将特定于视图的方法放在那里。 Google&#34; rails和decorators&#34;
继续讨论如何完成:
address = @organization.address
array = [address.line1, address.line2, address.city]
"#{array.join(', ')}." # also look into the "to_sentence" method
如果要排除nil条目,请在加入前使用compact。
如果要排除空白条目,请使用
array.reject(&:blank?)
如果您希望根据其状态在阵列中添加条目,那么以下内容将是合适的。
array = [].tap do |arr|
arr << address.line1 if address.line1.present?
# and so on
end
答案 4 :(得分:1)
[line_1, line_2, city, "#{state} #{zip}".strip].compact.join(', ')