2011-11-03 10 views
5

Ho lavorato parecchie ore su questo, ma non riesco a capire questo.Impostazione valuta con modulo select con Money gemma

Sono disposto a consentire all'utente di selezionare una valuta corrispondente al prezzo che sta compilando nel modulo.

Sto utilizzando la gemma di denaro (https://github.com/RubyMoney/money). Tutti i valori sono impostati correttamente MA non è la valuta che imposta solo il suo valore predefinito (USD), qualsiasi cosa viene inviata attraverso il modulo. Suppongo che questa sia la mia mancanza di esperienza con la gemma del Denaro.

nel mio modello:

require 'money' 
    composed_of :price_per_unit, 
    :class_name => "Money", 
    :mapping => [%w(cents_per_unit cents), %w(currency currency_as_string)], 
    :constructor => Proc.new { |cents_per_unit, currency| Money.new(cents_per_unit || 0, currency || Money.default_currency) }, 
    :converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't convert #{value.class} to Money") } 

    composed_of :total_price, 
    :class_name => "Money", 
    :mapping => [%w(cents cents), %w(currency currency_as_string)], 
    :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) }, 
    :converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't convert #{value.class} to Money") } 

: quota total_price in comune:: price_per_unit e l'attributo di valuta.

: price_per_unit lavorare con cents_per_unit e la valuta : total_price lavorare con centesimi e valuta

Nel mio controller:

def new 
    @power_plant_substrate = PowerPlantSubstrate.new 

    # preparing the form select for the currencies 
    @currencies = [] 
    major_currencies(Money::Currency::TABLE).each do |currency| 
     name = Money::Currency::TABLE[currency][:name] 
     iso_code = Money::Currency::TABLE[currency][:iso_code] 
     @currencies << [name, iso_code] 
    end 
    end 

Nella mia nuova vista della forma:

 <p> 
     <%= f.select(:currency, @currencies) %> 
     </p> 
     <p> 
     <%= f.label :price_per_unit %> 
     <%= f.number_field :price_per_unit, :size => 5, :value => 0, :step => 0.01, :min => 0 %> 
     </p> 
     <p> 
     <%= f.label :total_price %> 
     <%= f.number_field :total_price, { :step => 1, :size => 10, :value => 0 } %> 
     </p> 

ho provato cambiando la valuta predefinita in AUD, quindi tutti i miei record vengono impostati su AUD qualunque sia la mia scelta nella mia selezione.

nel mio ceppo:

Started POST "/power_plant_substrates" for 127.0.0.1 at 2011-11-03 00:40:38 +0100 
    Processing by PowerPlantSubstratesController#create as JS 
    Parameters: {"utf8"=>"✓", "feedstock"=>"", "power_plant_substrate"=>{"power_plant_id"=>"59", "substrate_id"=>"159", "quantity"=>"1", "trade"=>"selling", "currency"=>"JPY", "price_per_unit"=>"1.00", "total_price"=>"1", "address"=>"Pélussin, France", "transport"=>"pickup_only", "latitude"=>"", "longitude"=>"", "description"="sadf"}, "commit"=>"Save"} 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 21]] 
    PowerPlant Load (0.3ms) SELECT "power_plants".* FROM "power_plants" WHERE "power_plants"."user_id" = 21 AND "power_plants"."name" = 'My Tradings' LIMIT 1 
    SQL (0.7ms) INSERT INTO "power_plant_substrates" ("address", "cents", "cents_per_unit", "created_at", "currency", "description", "gmaps", "latitude", "locale", "longitude", "period","power_plant_id", "quantity", "state", "substrate_id", "trade", "transport","unit_of_measure", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?) [["address", "Pélussin, France"], ["cents", 100], ["cents_per_unit", 100], ["created_at", Wed, 02 Nov 2011 23:40:39 UTC +00:00], ["currency", "CAD"], ["description", "sadf"], ["gmaps", true], ["latitude", 45.417608], ["locale", "us"], ["longitude", 4.676041], ["period", "year"], ["power_plant_id", 59], ["quantity", 1], ["state", "open"], ["substrate_id", 159], ["trade", "selling"], ["transport", "pickup_only"], ["unit_of_measure", "mass"], ["updated_at", Wed, 02 Nov 2011 23:40:39 UTC +00:00]] 
Completed 200 OK in 1107ms (Views: 4.3ms | ActiveRecord: 2.5ms) 

Tutte le idee?

Cheers,

Joël

+0

risolto aggiungendo una riga creare metodo. Risolto il problema originale con la soluzione – zabumba

risposta

2

RISOLTO !!

risolto aggiungendo una riga creare metodo:

def create 
    @power_plant_substrate = PowerPlantSubstrate.new(params[:power_plant_substrate]) 

    # here I am setting the currency with what was sent in params 
    @power_plant_substrate.currency = params[:power_plant_substrate][:currency] <=== this line 

... 

end 
+0

Grande! Contrassegna come risolto :) –