what is the devise_mapping variable and how can I

2019-03-10 05:30发布

问题:

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:

undefined local variable or method `devise_mapping' for #<ActionView::Base:0x6d63890>

This is when I use the auto-generated partial _devise_links.html.

<%- if controller_name != 'sessions' %>
  <%= link_to t('devise.sessions.link'), new_session_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to t('devise.registrations.link'), new_registration_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
  <%= link_to t('devise.passwords.link'), new_password_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
  <%= link_to t('devise.confirmations.link'), new_confirmation_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.lockable? && controller_name != 'unlocks' %>
  <%= link_to t('devise.unlocks.link'), new_unlock_path(resource_name) %><br />
<% end -%>

Any ideas on how to fix this? I'm assuming the devise_mapping variable is not getting included in my views, but what do I do about it?

回答1:

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).



回答2:

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.



回答3:

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



回答4:

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