我想让用户在注册步骤中选择服务(免费,标准,专业版)。
以下是我正在使用的数据库模型:
(用户)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
现在,创建/保存用户的方式以及新用户和所选订阅之间的关系是什么?
答案 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