Rails error resource_name - devise help routing and rendering
resource_name
is defined in the Devise generated controllers. I don't think you can include those shared links in the application layout, I think they are intended for use on the devise forms (registration,sessions,passwords,confirmations,etc), which are rendered by devise controllers.
If you want to have little login/out snippets in every page, you might want to consider writing those links yourself. For instance, if your object that you're using devise for is user
, you could write this:
<%= link_to "Sign in", new_session_path(:user) %><br />
the resource_name
is just the Devise abstraction for the resource you're using. I expect that if you're making this link, you know which of your authenticated objects you want to login as, so you can specify it explicitly. You could aslo run rake routes | grep sessions
and see what the name of the path is and use that directly. For example:
<%= link_to "Sign in", new_user_session_path %><br />
Hans
Updated on July 23, 2022Comments
-
Hans almost 2 years
I am trying to render the login view for the Devise gem but I get an error, below is the code I currently have:
This is my
views/users/shared/_links.html.erb
:<%- if controller_name != 'sessions' %> <%= link_to "Sign in", new_session_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "Sign up", new_registration_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> <%= link_to "Forgot your password?", new_password_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br /> <% end -%> <% end -%>
And my
config/routes.rb
:Densidste::Application.routes.draw do match 'user/edit' => 'users#edit', :as => :edit_current_user match 'signup' => 'devise/users#new', :as => :signup match 'logout' => 'devise/sessions#destroy', :as => :logout devise_for :users do get "login", :to => "devise/sessions#new" end resources :sessions resources :users devise_for :users resources :aktivs resources :taggingposts resources :tags resources :kommentares resources :posts # You can have the root of your site routed with "root" # just remember to delete public/index.html. root :to => "public#index" end
And in my application layout:
<%= render("users/shared/links") %>
I get the following error in the
_links.html.erb
partial:NameError in Public#index Showing C:/Rails/Densidste/app/views/users/shared/_links.erb where line #2 raised: undefined local variable or method `resource_name' for #<#<Class:0x5db76c0>:0x5db6538> Extracted source (around line #2): 1: <%- if controller_name != 'sessions' %> 2: <%= link_to "Sign in", new_session_path(resource_name) %><br /> 3: <% end -%> 4: 5: <%- if devise_mapping.registerable? && controller_name != 'registrations' %> Trace of template inclusion: app/views/public/index.html.erb Rails.root: C:/Rails/Densidste
Finally, in my application controller I have the following:
before_filter :resource_name def resource_name if user_signed_in? current_user.name else :user end end end
Any help would be much appreciated, thanks!
-
Hans almost 13 yearsI have updated my question how do I create an before_filter :resource_name?
-
andrewmitchell almost 13 yearsI believe
resource_name
is generally the underscore version of the class name. You could trycurrent_user.class.name.underscore
. This should giveuser
for an object of typeUser
orfancy_user
for an object of class FancyUser. -
Jared Beck over 10 yearsThere are some helpful comments about these "resource-specific" helper methods in devise/controllers/url_helpers.rb
-
Koray Güclü almost 10 yearsthank this works. I replaced new_registration_path(resource_name) with new_user_registration_path it is working now.
-
DᴀʀᴛʜVᴀᴅᴇʀ almost 4 yearsShould post the code and not a link. Answers shouldn't rely on an external source.