使用devise update方法覆盖redirect_to行为

时间:2012-07-27 20:25:52

标签: ruby-on-rails ruby

我认为这是一个简单的问题是给我一些麻烦。我有一个Devise / Omniauth应用程序用于身份验证。当一个新用户注册并登录时,我希望他们被引导到几个问题(相继)询问:

  1. 他们喜欢什么饮料? (咖啡,饮料,两者)
  2. 哪些社区对他们来说很方便?
  3. 我的用户模型具有“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"}
    

    任何输入都表示赞赏! 谢谢。

1 个答案:

答案 0 :(得分:0)

您不应该重写设计更新操作,您需要重写

after_sign_in_path_for

设计路线。您可以在登录后将用户重定向到任何您喜欢的位置。您应该将其放在应用程序控制器中。

http://rubydoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers#after_sign_in_path_for-instance_method