Monday, 15 July 2013

ruby on rails - Save relation with omniauth identity -



ruby on rails - Save relation with omniauth identity -

i allow user take service (free, standard, pro) in registration step.

here db model i'm working with:

(user)1---n(subscription)n--1(service)

in "new user" form have customised code in order allow user chose service:

identities/new.hmtl.erb

<%= form_tag "/auth/identity/register", :html => {:role=>"form"} %> <div class="form-group"> <label>service</label> <%= select("service", "service_id", @available_services, {:selected => params[:service_id]}, {class:"form-control"}) %> </div> <div class="form-group"> <label>name</label> <%= text_field_tag :name, nil, class:"form-control" %> <p class="help-block">nome e cognome completo e corretto.</p> </div> <div class="form-group"> <label>email</label> <%= text_field_tag :email, @identity.try(:email), class:"form-control" %> </div> <div class="form-group"> <label>password</label> <%= password_field_tag :password, nil, class:"form-control"%> </div> <div class="form-group"> <label>password confirmation</label> <%= password_field_tag :password_confirmation, nil, class:"form-control"%> </div> <%= submit_tag "sign up",class:"btn btn-default" %> <% end %>

identities_controller.rb

class identitiescontroller < applicationcontroller skip_before_filter :require_login layout "static" def new @available_services = service.all.where(:id => [1, 2, 3]).collect {|p| [ p.name, p.id ] } @identity = env['omniauth.identity'] end end

now, what's way create/save user , relation between new user , selected subscription?

i solved by...

adding hidden field service:

#identitiy.new.html <%= hidden_field_tag :service_id, params[:service_id] %>

edited omniauth initializer follow:

#omniauth.rb rails.application.config.middleware.use omniauth::builder provider :identity,:fields => [:service_id,:name,:email], on_failed_registration: lambda { |env| identitiescontroller.action(:new).call(env) } end

added attr_accessor , after_create method in identity model:

#identity.rb class identity < omniauth::identity::models::activerecord attr_accessor :service_id validates_presence_of :name validates_uniqueness_of :email #validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i after_create :add_subscription private def add_subscription subscription.create(:user_id => self.id, :service_id => service_id.to_f) end end

ruby-on-rails ruby-on-rails-4 omniauth

No comments:

Post a Comment