2011-01-31 5 views
8

Mam problem z formularzami i money gem.Gem i konstruktor formularzy cennych railsów

To jest mój problem:

  1. utworzyć rekord, który ma "ilość" pole (odwzorowaną na obiekcie pieniędzy). Powiedzmy, że wpisuję 10 (dolarów).
  2. Pieniądze gem konwertuje go do 1000 (centów)
  3. edytować ten sam rekord i formy pre-zapełnia pole kwata 1000
  4. Gdybym zapisać rekord bez zmieniania czegokolwiek, będzie to konwersja 1000 (dolarów) do 100000 (centów)

Jak wyświetlić wyświetloną kwotę w dolarach zamiast centów?

Edit:

Próbowałem edycji _form.html takiego:

= f.text_field(:amount, :to_money) 

i otrzymuję ten błąd:

undefined method `merge' for :to_money:Symbol 
+0

To 1345 Myślę, że formularz pobiera wartość przechowywaną bez konwersji z powrotem na dolary. – David

+0

Jak to się stało, że 1000 jest konwertowane na 100, a nie na 1000 ?! Coś nie tak. Po drugie (nie korzystałem z klejnotu pieniędzy), ale podejrzewam, że czytnik atrybutu dla pola kwoty nie konwertuje wartości. A może to musi być zrobione przez ciebie, a nie klejnot? Kod, który napiszesz, pomoże. Wykonaj również inspekcję załadowanego rekordu i zobacz, jaka jest wartość pola kwoty. – Zabba

+0

Przepraszam, że to była literówka. Wstępnie zapełnia się jako 1000. – David

Odpowiedz

11

otrzymał migrację następująco:

class CreateItems < ActiveRecord::Migration 
    def self.up 
    create_table :items do |t| 
     t.integer :cents 
     t.string :currency 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :items 
    end 
end 

I model jako fol upadki:

class Item < ActiveRecord::Base 
    composed_of :amount, 
    :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 conver #{value.class} to Money") } 
end 

Następnie kod ten formularz powinien działać idealnie (I tylko przetestowane pod Rails 3.0.3), wyświetlanie i zapisywanie odpowiednio kwotę w dolarach za każdym razem zapisać/edit. (Jest to przy użyciu domyślnych metod aktualizacji/tworzenia rusztowań).

<%= form_for(@item) do |f| %> 
    <div class="field"> 
    <%= f.label :amount %><br /> 
    <%= f.text_field :amount %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

Twój przykład sprawił, że złapałem problem. W mojej migracji mam kwotę t.integer iw moim modelu mam created_of: amount. Spowodowało to konflikt. Dzięki. – David

+3

Dziękuję za tę odpowiedź. Tylko i FYI dla innych - gdzie napisano "[% w (centów centów)" ... pierwsze "centy" przedstawiają twoją kolumnę w ': items', a drugie' centy' to metoda klejnotu. –

3

Jeśli masz wiele pól pieniężnych w swoim stole i nie możesz wymienić wszystkich "centów".

class CreateItems < ActiveRecord::Migration 
    def self.up 
    create_table :items do |t| 
     t.integer :purchase_price_cents 
     t.string :currency 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :items 
    end 
end 

które mogłyby zmienić swój model do

class Item < ActiveRecord::Base 

    composed_of :purchase_price, 
    :class_name => "Money", 
    :mapping  => [%w(purchase_price_cents cents), %w(currency currency_as_string)], 
    :constructor => Proc.new { |purchase_price_cents, currency| Money.new(purchase_price_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") } 

end 
+0

Bardzo dobra odpowiedź. Podanie przykładu z kolumną "purchase_price_cents" jest mniej niejednoznaczne, ponieważ wyjaśnia, która z nich jest kolumną, a która funkcją. (% w (centre_wartość_ceny) vs% w (centów centów) – Christoph

3

Teraz można edytować zarabiasz pola bezpośrednio (pieniądze barierkami 1.3.0):

# add migration 
add_column :products, :price, :price_cents 

# set monetize for this field inside the model 
class Product 
    monetize :price_cents 
end 

# inside form use .price instead of .price_cents method 
f.text_field :price 

Zobacz https://stackoverflow.com/a/30763084/46039

Powiązane problemy