3

サインアップ ページとログイン ページで異なるレイアウトをレンダリングしたいと考えています。

この問題を扱う同様のスレッドがありますが、まったく同じではありません。

コントローラー内の他のすべてのアクションではなく、サインアップ ページとログイン ページのみに異なるレイアウトをレンダリングできるようにする必要があります。

users/registrations_controller.rb

class Users::RegistrationsController < Devise::SessionsController
  def new
    render :layout => "auth"
  end
end

私のルート

MasterCard::Application.routes.draw do
  devise_for :users, :controllers => { :registrations => "users/registrations" }, :path => "users", :path_names => { :sign_in => 'login', :sign_out => 'logout' }

  devise_scope :user do
    get "login", :to => "users/sessions#new"
    # post "logout", :to => "users/sessions"
  end

  root :to => 'pages#home'
  match '/about' => 'pages#about'
end

これは、サインアップ ページに移動したときに表示されるエラーです。

undefined methodエラー' for nil:NilClass`

4

1 に答える 1

3

Devise::RegistrationsControllerまず、ではなくサブクラス化するということDevise::SessionsControllerですか?

デバイス コントローラーのアクションをオーバーライドするのは、少し難しいようです。RegistrationsController以下を使用するデフォルトのレイアウトをオーバーライドするだけで、これを回避できます。

class Users::RegistrationsController < Devise::RegistrationsController
  layout "auth"
end

その特定のエラーが発生する理由については、次のとおりです。

あなたは、次の定義を持つnewべきであると私が想定しているものでアクションを再定義しDevise::RegistationsControllerています:

def new
  resource = build_resource({})
  respond_with resource
end

これはresource、devise ヘルパー メソッドで参照されるa を設定しdevise_error_messages!ます。

def devise_error_messages!
  return "" if resource.errors.empty?
  ...
end

これは、デフォルトのデバイス「sign_up」テンプレートで使用されますusers/registrations/new.html.erb:

...
<%= form_for(resource, :as => resource_name, ...) do |f| %>
  <%= devise_error_messages! %>
...

を定義していないため、このエラーが表示されますresource

于 2012-11-18T07:24:56.310 に答える