2013-11-22 2 views
1

Я знаю, рубин/рельсы все о конвенции, так что я думал, что я спросить, что соответствующий способ сделать что-то вроде этого:Каждый сделать согласно конвенции

<% @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, но моя внутренность говорит мне, что есть более подходящий способ сделать это в рубине. Какие-либо предложения?

ответ

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 %> 
+2

Это жизнеспособное, но как «значение» чисто презентационное, он также имеет смысл для этого, чтобы быть в помощнике, о Еще лучше, модель/декоратор (например, [draper] (https://github.com/drapergem/draper)). – numbers1311407

+0

Полностью ... Итак, почему мои пальцы, наполненные кофеином, просто добавили вспомогательную логику. :) – CDub

+1

Ха-ха, это очень основательно. Спасибо! Кроме того, @ numbers1311407 +1 для справки по драпировщику – Rob

Смежные вопросы