0

モデルヘルパーでメソッドを記述し、ビューでレンダリングしたいと思います。私の製品モデルには価格列があります。ビューでは、たとえば@product.tier_one_quantity_oneを記述できるようにしたいと思います。ヘルパーの書き方とレンダリングの仕方は?

1つのメソッドで複数の変数を割り当てることはできますか?

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

1 に答える 1

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 && match[0] && 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
于 2011-11-01T19:13:38.910 に答える