保存与omniauth身份的关系

时间:2014-06-23 20:15:44

标签: ruby-on-rails ruby-on-rails-4 omniauth

我想让用户在注册步骤中选择服务(免费,标准,专业版)。

以下是我正在使用的数据库模型:

(用户)1 --- N(订阅)N - 1(服务)

在"新用户" form我有这个自定义代码,以便让用户选择服务:

身份/ new.hmtl.erb

<%= form_tag "/auth/identity/register", :html => {:role=>"form"} do %> 
  <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

现在,创建/保存用户的方式以及新用户和所选订阅之间的关系是什么?

1 个答案:

答案 0 :(得分:0)

我通过......解决了这个问题。

为服务添加隐藏字段:

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

编辑omniauth初始化程序如下:

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

在Identity模型中添加了attr_accessor和after_create方法:

#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