2011-01-31 14 views
8

मुझे फॉर्म और money gem के साथ कोई समस्या है।रेल मनी मणि और फॉर्म बिल्डर

  1. मैं एक रिकॉर्ड है जो एक "राशि" क्षेत्र (पैसा वस्तु को मैप किया है) बनाने के लिए:

    यह मेरी समस्या नहीं है। मान लें कि मैं 10 (डॉलर) दर्ज करता हूं।

  2. पैसे मणि यह 1000 (सेंट) में धर्मान्तरित
  3. मैं एक ही रिकॉर्ड और फार्म को संपादित कुछ भी बदले बिना 1000
  4. अगर मैं रिकॉर्ड को बचाने के रूप में राशि फ़ील्ड पूर्व भरता है, यह 1000 में परिवर्तित कर देंगे (डॉलर) 100000 (सेंट)

मैं इसे सेंट के बजाय डॉलर में पूर्व-जनसंख्या राशि कैसे प्रदर्शित करूं?

संपादित करें:

मैं संपादन इस तरह _form.html की कोशिश की:

= f.text_field(:amount, :to_money) 

और मैं इस त्रुटि मिलती है: इस प्रकार

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

यह 1345 है मुझे लगता है कि फॉर्म संग्रहीत मूल्य को वापस डॉलर में परिवर्तित किए बिना पुनर्प्राप्त कर रहा है। – David

+0

तो कैसे 1,000 को 100 में परिवर्तित किया जा रहा है और 1,000 प्रदर्शित नहीं किया जा रहा है ?! वहां कुछ गड़बड़ है। दूसरा (मैंने मनी मणि का उपयोग नहीं किया है) लेकिन मुझे संदेह है कि राशि क्षेत्र के लिए विशेषता पाठक मूल्य को परिवर्तित नहीं कर रहा है। या शायद यह आपके द्वारा किया जाना चाहिए, मणि नहीं? आपके द्वारा पोस्ट किया गया कुछ कोड मदद करेगा। साथ ही, लोड किए गए रिकॉर्ड पर एक निरीक्षण करें और देखें कि राशि फ़ील्ड का मूल्य क्या है। – Zabba

+0

क्षमा करें कि एक टाइपो था। यह 1000 के रूप में पूर्व-पॉप्युलेट करता है। – David

उत्तर

11

एक प्रवास को देखते हुए:

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 

और फोल के रूप में एक मॉडल चढ़ाव:

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 

तो इस प्रपत्र कोड पूरी तरह से काम करना चाहिए (मैं सिर्फ रेल 3.0.3 के तहत परीक्षण किया), ठीक से दिखाई और डॉलर की राशि हर बार जब आप को बचाने के/संपादन सहेजने। (यह डिफ़ॉल्ट मचान अद्यतन/बनाने के तरीकों का उपयोग कर रहा है)।

<%= 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

आपके उदाहरण ने मुझे समस्या को पकड़ लिया। मेरे माइग्रेशन में मेरे पास t.integer राशि है और मेरे मॉडल में मैंने composed_of: राशि है। इससे एक संघर्ष हुआ। धन्यवाद। – David

+3

इस उत्तर के लिए धन्यवाद। बस और एफवाईआई दूसरों के लिए - जहां '[% डब्ल्यू (सेंट सेंट)' लिखा गया है, पहला 'सेंट' आपके कॉलम को 'आइटम' में दर्शाता है और दूसरा 'सेंट 'मणि का एक तरीका है। –

3

यदि आपके टेबल में एकाधिक धन फ़ील्ड हैं और आप उन्हें सभी "सेंट" नाम नहीं दे सकते हैं।

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 

जो

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

बहुत अच्छा जवाब। कॉलम "buy_price_cents" के साथ एक उदाहरण देना कम अस्पष्ट है क्योंकि यह स्पष्ट करता है कि कौन सा कॉलम है और कौन सा फ़ंक्शन है। (% डब्ल्यू (buy_price_cents सेंट) बनाम% डब्ल्यू (सेंट सेंट) – Christoph

3

करने के लिए अपने मॉडल बदल जाएगा अब आप सीधे मुद्रीकृत क्षेत्रों संपादित कर सकते हैं (पैसा रेल 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 

देखें https://stackoverflow.com/a/30763084/46039