what is the devise_mapping variable and how can I include it?

前端 未结 4 737
栀梦
栀梦 2021-02-01 21:19

I\'m trying to implement authentication with Devise in my Rails application (Rails 2.3.8, Devise 1.0.7, mongrel running on Windows Vista). But I\'m getting the following error:<

相关标签:
4条回答
  • 2021-02-01 22:05

    I realize this question is kind of old, but I think I figured out why you can't just render that partial. The partial you're trying to render is the partial for the links that show up below the sign_in/sign_up form.

    If you'd like to add those links to your application, this page on the Devise Wiki will show you how to do it, and it involves creating your own partial(s).

    EDIT (2019-04-01): Copying the information from the Devise wiki page here for persistence.

    How To: Add sign_in, sign_out, and sign_up links to your layout template

    First add sign_in/out links, so the appropriate one will show up depending on whether the user is _already_ signed in:
    # views/devise/menu/_login_items.html.erb
    <% if user_signed_in? %>
      <li>
      <%= link_to('Logout', destroy_user_session_path, method: :delete) %>        
      </li>
    <% else %>
      <li>
      <%= link_to('Login', new_user_session_path)  %>  
      </li>
    <% end %>
    
    The method: :delete part is required if you use the default HTTP method. To change it, you will need to tell Devise this:
    # config/initializers/devise.rb
      # The default HTTP method used to sign out a resource. Default is :delete.
      config.sign_out_via = :get
    
    You can then omit method: :delete on all your sign_out links. Next come the sign_up links. Again, these can be substituted with something else useful if the user is already signed in:
    # views/devise/menu/_registration_items.html.erb
    <% if user_signed_in? %>
      <li>
      <%= link_to('Edit registration', edit_user_registration_path) %>
      </li>
    <% else %>
      <li>
      <%= link_to('Register', new_user_registration_path)  %>
      </li>
    <% end %>
    
    Then use these templates in your layouts/application.html.erb, like this:
    # layouts/application.html.erb
    <ul class="hmenu">
      <%= render 'devise/menu/registration_items' %>
      <%= render 'devise/menu/login_items' %>
    </ul>
    <%= yield %>
    
    Add some menu styling to the CSS (here for a horizontal menu):
    ul.hmenu {
      list-style: none; 
      margin: 0 0 2em;
      padding: 0;
    }
    
    ul.hmenu li {
      display: inline;  
    }
    
    0 讨论(0)
  • 2021-02-01 22:15

    You can add helper methods to ApplicationHelper. Make sure to use the proper model name (in my case it's :user representing the User model).

    def devise_mapping
      Devise.mappings[:user]
    end
    
    def resource_name
      devise_mapping.name
    end
    
    def resource_class
      devise_mapping.to
    end
    

    Update 1/28/2014

    The master branch of Devise shows that devise_mapping is now stored in the request:

    # Attempt to find the mapped route for devise based on request path
    def devise_mapping
      @devise_mapping ||= request.env["devise.mapping"]
    end
    

    And resource_name is aliased as scope_name as well. See devise_controller.rb for more info.

    0 讨论(0)
  • 2021-02-01 22:18

    Instead of using devise_mapping, you can use Devise.mappings[:user], given that the user class in question is User.

    0 讨论(0)
  • 2021-02-01 22:21

    Do you have the devise_for call in your routes.rb file?

    For instance, if you are using it for your User class, then the route would be:

    devise_for :users

    for more info, see https://github.com/plataformatec/devise

    0 讨论(0)
提交回复
热议问题