Rails error resource_name - devise help routing and rendering

14,508

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 />
Share:
14,508
Hans
Author by

Hans

Updated on July 23, 2022

Comments

  • Hans
    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
    Hans almost 13 years
    I have updated my question how do I create an before_filter :resource_name?
  • andrewmitchell
    andrewmitchell almost 13 years
    I believe resource_name is generally the underscore version of the class name. You could try current_user.class.name.underscore. This should give user for an object of type User or fancy_user for an object of class FancyUser.
  • Jared Beck
    Jared Beck over 10 years
    There are some helpful comments about these "resource-specific" helper methods in devise/controllers/url_helpers.rb
  • Koray Güclü
    Koray Güclü almost 10 years
    thank this works. I replaced new_registration_path(resource_name) with new_user_registration_path it is working now.
  • DᴀʀᴛʜVᴀᴅᴇʀ
    DᴀʀᴛʜVᴀᴅᴇʀ almost 4 years
    Should post the code and not a link. Answers shouldn't rely on an external source.