Rails devise и omniauth facebook с пользовательской регистрационной формой - PullRequest
0 голосов
/ 15 марта 2019

Я использую устройство и пользовательскую форму для регистрации пользователей в моем приложении.Пользователь должен заполнить некоторые данные в этой форме, прежде чем «зарегистрироваться».Так что эта пользовательская форма содержит настраиваемые поля (вид работы, цена ...).Эти информ.хранятся в «профиле», когда пользователь успешно подписан.

Я создаю пользовательский контроллер регистрации: customregisters_controller.rb

 class CustomRegistersController < Devise::RegistrationsController 

 def new      
   super do |resource|           
     @user = resource.build_profile                 
   end    
 end

 def create           
  super                   
   @profile = Profile.new(user: resource, jobkind: @jobkind, price: 
    @price ...    
   @profile.user_id = resource.id             
   @profile.save       
 end        
end


protected  
def after_sign_up_path_for(resource)                 
  sign_in(resource)                          
end


def sign_up_params    
  params.require(:user)
        .permit(
            :fullname, :password, :email, :phone_number, 
           profile_attributes: [:jobkind, :price])

  end  
end    

И представление CustomRegister: /customregisters/new.html.erb

<%= form_for( resource, as: :user, :html => {class: 'demo-form'},  url: customregisters_path ) do |f| %>

<div> ... 
 <%= f.fields_for :profile do |p| %>              
     <%= p.text_field :price %>
     <%= p.text_area :jobkind %>
 <% end %> 
 ...
 # For devise registration with fullname + email / password.. OK
  <div class="form-group">
                  <%= f.text_field :fullname, autofocus: true, placeholder: "FullName", class: "form-control", required:true %>
                </div>
                <div class="form-group">
                  <%= f.email_field :email, id:"email", autofocus: true, placeholder: "Email", class: "form-control", required: true %>
                </div>
                <div class="form-group">
                  <%= f.password_field :password, autocomplete: "off", placeholder: "Password", class: "form-control", required: true %>
                </div>         
        <%= f.submit "Register", id:"submit_btn", class: "btn btn-normal " %>   

Itработает очень хорошо, но я хочу добавить Omniauth с логином Facebook в конце вместо классического устройства.

Поэтому я добавляю в представление

<%= link_to "Register with Facebook", 
user_facebook_omniauth_authorize_path, class: "btn btn-facebook btn- 
block" %> 

Мой OmniauthCallbacksController:

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

def facebook
  user = User.from_omniauth(request.env["omniauth.auth"])

  if user.persisted?      
    sign_in user, :event => :authentication        
  set_flash_message(:notice, :success, :kind => "Facebook") if 
     is_navigational_format?                      
  #redirect_to ?????
  else
    session["devise.facebook_data"] = request.env["omniauth.auth"]
    redirect_to new_user_registration_url
  end
end

Когда пользователь нажимает «Зарегистрироваться в FB», я хочу аутентифицировать его, подписывать и создавать профиль с информацией о пользователе, которую он заполнил в пользовательской форме, как моя «классическая» регистрация устройства.

Вопрос: аутентификация с FB работает (и пользователь sign_in), но после этого, как я могу создать профиль (как в моем customregisters_controller?), Я теряю данные пользовательского представления.Я не знаю, как решить эту проблему ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...