3

Devise登録コントローラーを上書きしようとしています。セットアップは次のとおりです。

Registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController
  before_filter :authenticate_user!, :only => :token

  def new
    super
  end

  def create
    @request.env["devise.mapping"] = Devise.mappings[:user]
    @user = User.new(params[:user])

    if @user.save
      render 'create.js', :success => true
    else
      render 'create.js', :success => false
    end
  end
end

ルート.rb

(...)
devise_for :users, :controllers => {:sessions => 'sessions', :registrations => 'registrations'}
match 'registrations/create'        => 'registrations#create'   , :as => :user_register
# not matter if i'll put `match 'registrations/create'` line above or under the `devise_for` line
(...)

そしてそれはすべて(私がブラウザを指すときregistrations/create)私にエラーを与えます:

不明なアクション

パス「/registrations/create」のデバイスマッピングが見つかりませんでした。これは、次の2つの理由で発生する可能性があります。1)ルートをスコープブロック内にラップするのを忘れた。例:devise_scope:user do match "/ some / route" => "some_devise_controller" end 2)ルーターをバイパスするDeviseコントローラーをテストしています。その場合、使用するマッピングをDeviseに明示的に指示できます。@ request.env ["devise.mapping"] = Devise.mappings [:user]

同様の問題を説明しているスレッドをいくつか見つけましたが、まったく役に立ちませんでした。アドバイスありがとうございます!

4

1 に答える 1

5

エラーメッセージに明確に示されているように、Deviseルートを次のようにブロックでラップする必要があります。

devise_scope :user do
  match 'registrations/create' => 'registrations#create', :as => :user_register
end

Deviseは、そのブロック外のルートを受け入れません。

于 2012-08-22T13:08:02.597 に答える