#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
То же самое относится и к уровню 4Tier_four_quantity_one = product.price * (1 PERCENTAGE) where PERCENTAGE = 0.2