0

単純な問題だと思っていたことが、私に問題を引き起こしています。認証用の Devise/Omniauth を使用したアプリケーションがあります。新しいユーザーがサインアップしてログインすると、次のようないくつかの質問に (連続して) 案内されるようにします。

  1. 彼らはどんな飲み物が好きですか? (コーヒー、ドリンク、両方)
  2. 彼らにとってどの地域が便利ですか?

私のユーザー モデルには、3 つの preferred_neighborhood_# 属性 (preferred_neighborhood_one、preferred_neighborhood_two、preferred_neighborhood_three) と共に "preferred_beverage" 属性があります。

ユーザーがサインインしたときに、彼らが新しいユーザーかどうかを確認し、そうであれば、質問 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」属性が保存されているにもかかわらず、ユーザーへの変更を処理して root_path にリダイレクトしているように見えるデフォルトの Devise の「update」メソッドを適切に上書きできないことです。「preferred_beverage」の送信時に /app/views/neighborhood_survey/new.html.erb フォームに直接リダイレクトしたい。

デフォルトのDevise registrations_controllerを上書きするために使用しているこのregistrations_controller.rbの「更新」セクションに正確に何を入れる必要がありますか?

app/controllers/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"}

どんな入力でも大歓迎です!ありがとうございました。

4

1 に答える 1

0

デバイスの更新アクションをオーバーライドするべきではありません。オーバーライドする必要があります

after_sign_in_path_for

考案ルート。ユーザーがサインインした後、ユーザーを好きな場所にリダイレクトできます。これをアプリケーション コントローラーに配置する必要があります。

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

于 2012-07-27T21:08:56.967 に答える