This guide is about how to create new class with hash parameters, without ActiveRecord. If you don't want to use database to define a new object, this guide is for you. First, we create a new contact.rb file in "app/models" directory
class Contact include ActiveModel::Serialization attr_accessor :name, :company_name, :email, :phone, :comment def initialize(attributes = {}) @name=attributes[:name] @company_name=attributes[:company_name] @email=attributes[:email] @phone=attributes[:phone] @comment=attributes[:comment] end # persisted is important not to get "undefined method `to_key' for" error def persisted? false end end
And then you can use this model to create a new form, like ActiveRecord in controllers:
@contact=Contact.new
or
@contact=Contact.new(params[:contact])
Now we can use this object to send email to sales or save it to another object's text column with json. For example if there is a json_contact text column in User active_record object, users.rb:
Class User < ActiveRecord::Base before_save :before_save_function def before_save_function unless self.json_contact.is_a?(String) then # we need this condition because if we updating, must know if it is a String (json modelled class) or a Contact model class self.json_contact=self.json_contact.to_json end true end def contact unless self.json_contact.nil? then contact_hash = ActiveSupport::JSON.decode(self.json_contact).symbolize_keys.clone return Contact.new(contact_hash) else return nil end end end
Then you can give a Contact object to User.json_contact like:
@user=... # your turn (find, or create)
@contact=Contact.new(params[:contact])
@user.json_contact=@contact
@user.save
Don't forget to restart your application after modifying anything in your models. Now you can get original User.contact as an object, and you can use it like Contact model:
contact_name=@user.contact.name
That's all
This comment has been removed by a blog administrator.
ReplyDelete