我知道ruby / rails是关于约定的,所以我想我会问这样做的合适方法是:
<% @event.prices.each do |price| %>
<% price_value = price.price > 0 ? "FREE" : price.price %> <!-- ** this line ** -->
<% if price.name.length > 0 %>
<div>$<%= price_value %> - <%= price.name %></div>
<% else %>
<div>$<%= price_value %> - Ticket Type <%= price.id + 1 %></div>
<% end %>
<% end %>
正如你所看到的,我正在设置price_value以避免一大堆if语句,但我的直觉告诉我,在ruby中有更合适的方法。有什么建议吗?
答案 0 :(得分:3)
取决于prices
是什么......它看起来像是一种关系。如果是,那么你有一个Price
对象,你可以把它放在一个方法上,称之为value
或类似的东西,它为你提供了逻辑:
class Price < ActiveRecord::Base
def value
self.price > 0 ? "FREE" : self.price
end
end
然后在您看来,您只需拨打price.value
:
<% @event.prices.each do |price| %>
<% if price.name.length > 0 %>
<div>$<%= price.value %> - <%= price.name %></div>
<% else %>
<div>$<%= price.value %> - Ticket Type <%= price.id + 1 %></div>
<% end %>
<% end %>
你也可以跟name
同样的约定......类似的东西:
class Price < ActiveRecord::Base
def value
self.price > 0 ? "FREE" : self.price
end
def get_name
self.name.present? ? self.name : "Ticket Type #{self.id + 1}"
end
end
然后你的观点看起来像:
<% @event.prices.each do |price| %>
<div>$<%= price.value %> - <%= price.get_name %></div>
<% end %>
由于我已经开始了(显然今天方式过多的咖啡因),那么你可以创建一个帮助你的方法$<%= price.value %> - <%= price.get_name %>
module PriceHelper
def generate_price_value_and_name(price)
"$#{price.value} - #{price.get_name}"
end
end
现在你的观点是:
<% @event.prices.each do |price| %>
<div><%= generate_price_value_and_name(price) %></div>
<% end %>