Question

Devise (2.1) was using my custom views fine until I told it to use a custom controller. Now it ignores my custom views.

Previously everything worked fine:

Tell Devise to use custom views in /config/devise.rb

# ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you
# are using only default views.
config.scoped_views = true

Add custom view: /app/views/subscribers/session/new.html.erb

Set up routes in /config/routes.rb

devise_for :subscribers

Then I added a custom SubscriberSessionsController as /app/controllers/subscriber_session_controller.rb

class SubscriberSessionsController < Devise::SessionsController

    before_filter :isInIframe

    private

        def isInIframe
            @hide_navbar = session[:in_iframe]
        end

end

And modified /config/routes.rb to tell Devise to use this new controller instead of its default:

devise_for :subscribers, :controllers => { 
    :sessions => "subscriber_sessions"
  }

Once I restart my server, Devise now uses this controller but ignores my custom view.

Was it helpful?

Solution

As is so often the case, ten minutes after posting the question I cracked it.

The reason Devise wasn't finding the view was it was looking for it in a different folder.My replacement controller was called subscriber_sessions.rbso devise was no longer looking in views/subscribers/sessions but views/subscribers/subscriber_sessions.

I solved this problem with the following:

Changed my subscriber routes to:

  devise_for :subscribers, :controllers => { 
    :sessions => "subscribers/sessions"
  }

Renamed my subscriber_sessions controller to just sessions and moved it into a subscribers folder so its new name & location are: app/controllers/subscribers/sessions_controller.rb

I also had to add a namespace to the class so the new sessions_controller.rb file looks like this"

class Subscribers::SessionsController < Devise::SessionsController

    before_filter :isInIframe

    private

        def isInIframe
            @hide_navbar = session[:in_iframe]
        end

end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top