Помощник модели в rails и визуализация в представлении

#ruby-on-rails-3 #view-helpers

#ruby-on-rails-3 #помощники представления

Вопрос:

Я хочу написать какой-то метод в помощнике модели и визуализировать в моем представлении. В моей модели продукта есть столбец цены. В представлении я хочу иметь возможность написать, например, @product.tier_one_quantity_one . Как написать помощника и как визуализировать?

Могу ли я назначить несколько переменных в одном методе?

 module ProductsHelper
  def price_variation(product)
    @tier_one_quantity_one = @product.price * 1.2
    @tier_one_quantity_wo = @product.price * 1.4
    ...
  end
end
 

Ответ №1:

Помощники используют более функциональный подход:

 module ProductsHelper
  def tiered_price(product, tier, quantity)
    price = case tier
      when 1 then product.price * 1.2
      when 2 then product.price * 1.4
      else product.price * 1.6
    end
    price * product.quantity
  end
end

# view
<%= number_to_currency( tiered_price(@product, 1, 2) ) %>
 

Но мне кажется, что это было бы лучше в модели:

 class Product < ActiveRecord::Base
  def tiered_price(tier, quantity)
    price = case tier
      when 1 then price * 1.2
      when 2 then price * 1.4
      else price * 1.6
    end
    price * quantity
  end
 end

 # view
 <%= number_to_currency(@product.tiered_price(1, 2)) %>
 

Если вы действительно хотите иметь возможность писать @product.tier_one_quanity_two, например, find_by_name , вам нужно подключиться к method_missing , который имеет некоторую сложность и накладные расходы на скорость, но будет выглядеть примерно так:

 class Product < ActiveRecord::Base
  def method_missing(method, *args)
    match = method.to_s.match(/tier_(.*)_quantity_(.*)/)
    if match amp;amp; match[0] amp;amp; match[1]
      unit_price = case match[0]
        when 'one' then price * 1.2
        when 'two' then price * 1.4
        else price * 1.6
      end
      quantity = case match[1]
        when 'one' then 1
        when 'two' then 2
        #.. and so on
      end 
      unit_price * quantity
    else
      super
    end
  end
end
 

Комментарии:

1. спасибо за ваш ответ, но мне нужно отображать несколько вариантов цен для каждого отдельного продукта, не получая правильную цену из разных сценариев. Эти изменения рассчитываются из столбца product.price

2. На самом деле, что мне нужно сделать, это tier_three_quantity_one = product.price . tier_three_quantity_two = tier_three_quantity_one * (1- VOLUME) where VOLUME = 0.02 То же самое относится и к уровню 4 Tier_four_quantity_one = product.price * (1 PERCENTAGE) where PERCENTAGE = 0.2