我认为这是一个简单的问题是给我一些麻烦。我有一个Devise / Omniauth应用程序用于身份验证。当一个新用户注册并登录时,我希望他们被引导到几个问题(相继)询问:
我的用户模型具有“preferred_beverage”属性以及三个preferred_neighborhood_#属性(preferred_neighborhood_one,preferred_neighborhood_two,preferred_neighborhood_three)。
当用户登录时,我想检查他们是否是新用户,如果是,请将他们引导至问题1的页面:
<div class="center hero-unit">
<h2>What do you like to drink?</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= f.radio_button :preferred_beverage, 'Coffee', :checked => true %>
<%= label :preferred_beverage, 'Coffee' %>
<%= f.radio_button :preferred_beverage, 'Drink' %>
<%= label :preferred_beverage, 'Drink' %>
<%= f.radio_button :preferred_beverage, 'Both' %>
<%= label :preferred_beverage, 'Both' %>
<%= f.submit "Next", class: "btn btn-large btn-primary" %>
<% end %>
</div>
问题在于,在提交此表单时,即使用户的“preferred_beverage”属性正在保存,我也无法正确覆盖默认的Devise“update”方法,该方法似乎正在处理对User的任何修改并重定向到root_path 。我想在提交'preferred_beverage'后直接重定向到我的/app/views/neighborhood_survey/new.html.erb表单。
我需要在这个registrations_controller.rb的“update”部分中放置什么才能覆盖默认的Devise registrations_controller?
应用程序/控制器/ registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
def create
super
session[:omniauth] = nil unless @user.new_record?
end
def update
end
private
def build_resource(*args)
super
if session[:omniauth]
@user.apply_omniauth(session[:omniauth])
@user.valid?
end
end
end
我完成了以下内容以确保我的registrations_controller用以下内容覆盖了Devise注册控制器:
routes.rb
devise_for :users, path_names: {sign_in: "login", sign_out: "logout"},
controllers: {omniauth_callbacks: "omniauth_callbacks", :registrations => "registrations"}
任何输入都表示赞赏! 谢谢。
答案 0 :(得分:0)
您不应该重写设计更新操作,您需要重写
after_sign_in_path_for
设计路线。您可以在登录后将用户重定向到任何您喜欢的位置。您应该将其放在应用程序控制器中。