每个都按照惯例做

时间:2013-11-22 20:40:02

标签: ruby-on-rails ruby

我知道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中有更合适的方法。有什么建议吗?

1 个答案:

答案 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 %>