1

多数の SO 投稿 (つまり、 herehere、およびhere ) に投稿されたソリューションを読んで試してみました。また、失敗した登録後にパスを変更する方法に関する Devise の回答と、Devise のRegistrationsController コードもすべて役に立ちませんでした。

/lib/ほとんどの提案のようにフォルダーでカスタムの失敗メソッドを実行する代わりに、これを修正/オーバーライドする最も簡単な場所のように思われるのRegistrationsController#createは、下部にあるメソッドです。

else
  clean_up_passwords resource
  respond_with resource
end

(私が思うに) で正しく応答していますuser(つまり、それらを にリダイレクトしますroot_path/users)。メソッドをいじるとRegistrationsController#create、完全に機能するネストされたモデルが壊れてしまうのではないかと心配しています。

また、Devise ソリューションがうまくいかなかったが、ルーティングの問題を変更した後に機能するようになったと述べた人もいます。私の場合はそうではないと思いますが、念のため私のroutes.rbファイルは次のとおりです。

  devise_for :users, :controllers => { :registrations => "registrations" }
  resources :users

  resources :users do
    resources :lockers
  end

  resources :lockers do
    resources :products
  end

  resources :products
  resources :lockups

  match '/user/:id', :to => 'users#show', :as => :user

  root :to => 'home#index'

誰かが私に提供できる助けに心から感謝します。私はまだ Rails を使い始めたばかりですが、学ぶことをいつも楽しみにしています。

編集:else Passionate のおかげで、登録コントローラーの最終ブロックのロジックを変更する方法を見つけようとしています。これが私が試したことです(私のnoobロジックとともに):

  # Obviously cleared all the fields since it made no mention of resource
  # redirect_to root_path

  # Too many arguments since root_path takes 0
  # redirect_to root_path resource

  # Just bombed, something about a String somethingorother
  # render root_path

  # Heh, apparently call 'respond_with' and 'redirect_to' multiple times in one action
  # respond_with resource
  # redirect_to root_path
4

1 に答える 1

0

まず、routes.rbfile を修正する必要があります。devise_scopeカスタム controller を使用しているため、 blockもカスタマイズする必要があります。変化する

get "signup", :to => "devise/registrations#new"

get "signup", :to => "registrations#new"

そして、メソッドをオーバーライドしようとして、デバイスのroot_pathレール登録後に設定したい場合は、次のようにすることができます

# app/controllers/registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController
   def create
     build_resource
     // The `build_resource` will build the users . 
    if resource.save
     if resource.active_for_authentication?
      set_flash_message :notice, :signed_up if is_navigational_format?
      sign_up(resource_name, resource)
      respond_with resource, :location => after_sign_up_path_for(resource)
     else
      set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
      expire_session_data_after_sign_in!
      respond_with resource, :location => after_inactive_sign_up_path_for(resource)
     end
    else

     clean_up_passwords resource
     ## replace your logic here
     redirect_to root_path
    end
   end
end

上記のコードは で動作することに注意してくださいdevise 2.2.4。現在、github の master ブランチにあるコードは、rails 4 と strong_parameter の互換性のために若干変更されています。

于 2013-05-27T19:13:50.357 に答える