When submitting billing information in the past I''ve always used attr_accessor for credit card details as they should not be saved in the database. In addition I always end up storing the card expiration date so that the date form helper works correctly. With Active Model it seems logical to create a CreditCard class to hold this data instead. **1st issue.** It seems there still isn''t support for handling the form date_select. (the card_expires_on(*) parameters). Should this work? Perhaps I''m just missing an ActiveModel module **2nd issue.** In a perfect world this CreditCard class would be on the same form as an ActiveRecord Order class but I have not been able to get an ActiveModel to work as a nested object on a form. something like this.. on the order new form <%= form_for @order do |f| -%> . order stuff here.... <% f.fields_for :credit_card do |cc_fields| %> <%= cc_fields.label :card_number, ''*Number'' %> <%= cc_fields.text_field :card_number, :class => ''text'', :autocomplete => ''off'' %> <% end %> I have not found what magic I need to add to the order model to make this work. The <% f.fields_for :credit_card do |cc_fields| %> block is never executed if credit card was an ActiveRecord I would simply put has_one :credit_card accepts_nested_attributes_for :credit_card instead I added a attr_accessor :credit_card to the Order ActiveRecord class and my credit_card class looks like this.... class CreditCard include ActiveModel::Validations include ActiveModel::AttributeMethods include ActiveModel::Callbacks include ActiveModel::Conversion extend ActiveModel::Naming # belongs_to :user attr_accessor :card_type, :card_number, :card_verification, :card_expires_on, :agree validates :card_type, :card_number, :card_verification, :card_expires_on, :agree, :presence => true def initialize(attributes = {}) expire_date = {} #raise attributes.inspect attributes.each do |name, value| send("#{name}=", value) #this breaks on date items from date_select end end def persisted? false end end Any idea what I am missing? -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Figured out why my ActiveModel was not displaying.. <% f.fields_for :credit_card do |cc_fields| %> needs to be <%= f.fields_for :credit_card do |cc_fields| %> I have another nested element on this page that is an ActiveRecord. That one gives a deprecation warning. For some reason the fields_for that takes an ActiveModel gives no warning. It just doesn''t work. odd. Anyone know a built in way to handle date_select parameters from ActiveModel? just FYI.. here is part of my view. (addresses is an ActiveRecord and credit_card is an ActiveModel) <% f.fields_for :credit_card do |cc_fields| %> <%= render :partial => "cc_fields", :locals => { :cc_fields => cc_fields} %> <% end %> <% f.fields_for :addresses do |address_fields| %> <%= render :partial => "address_fields", :locals => { :address_fields => address_fields, :use_org => true } %> <% end %> It doesn''t matter what order these are in the address form will always display and the credit_card will not (unless i use <%=) On Aug 13, 1:16 pm, Tony <tony.primer...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> When submitting billing information in the past I''ve always used > attr_accessor for credit card details as they should not be saved in > the database. In addition I always end up storing the card > expiration date so that the date form helper works correctly. > > With Active Model it seems logical to create a CreditCard class to > hold this data instead. > > **1st issue.** > > It seems there still isn''t support for handling the form date_select. > (the card_expires_on(*) parameters). Should this work? Perhaps I''m > just missing an ActiveModel module > > **2nd issue.** > > In a perfect world this CreditCard class would be on the same form as > an ActiveRecord Order class but I have not been able to get an > ActiveModel to work as a nested object on a form. > > something like this.. on the order new form > <%= form_for @order do |f| -%> > . order stuff here.... > <% f.fields_for :credit_card do |cc_fields| %> > <%= cc_fields.label :card_number, ''*Number'' %> > <%= cc_fields.text_field :card_number, :class => > ''text'', :autocomplete => ''off'' %> > <% end %> > > I have not found what magic I need to add to the order model to make > this work. > > The <% f.fields_for :credit_card do |cc_fields| %> block is never > executed > > if credit card was an ActiveRecord I would simply put > has_one :credit_card > accepts_nested_attributes_for :credit_card > > instead I added a > attr_accessor :credit_card to the Order ActiveRecord class > > and my credit_card class looks like this.... > > class CreditCard > > include ActiveModel::Validations > include ActiveModel::AttributeMethods > include ActiveModel::Callbacks > include ActiveModel::Conversion > extend ActiveModel::Naming > > # belongs_to :user > > attr_accessor :card_type, :card_number, :card_verification, :card_expires_on, :agree > > validates :card_type, :card_number, :card_verification, :card_expires_on, :agree, :presence > => true > > def initialize(attributes = {}) > expire_date = {} > #raise attributes.inspect > attributes.each do |name, value| > send("#{name}=", value) > #this breaks on date items from date_select > end > end > > def persisted? > false > end > end > > Any idea what I am missing?-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
David Gonzalez
2010-Sep-30 04:24 UTC
Re: Rails 3 / ActiveModel for Credit Card information?
Have you had any luck w this? I am effectively doing the same thing. I can get my Credit Card form to appear in with in my Order form, however if the form doesn''t validate, all my Credit Card info is lost and the user has to re-type it in. I believe it has something to do with the my Order class (which extends Activerecord::Base) does not: accepts_nested_attributes_for :credit_card therefore the input names aren''t being created correctly, etc. Thoughts? -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.