Что такое переменная devise_mapping и как я могу ее включить? - PullRequest
17 голосов
/ 27 декабря 2010

Я пытаюсь реализовать аутентификацию с помощью Devise в моем приложении на Rails (Rails 2.3.8, Devise 1.0.7, mongrel, работающий в Windows Vista).Но я получаю следующую ошибку:

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

Это когда я использую автоматически сгенерированный частичный _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 -%>

Есть идеи, как это исправить?Я предполагаю, что переменная devise_mapping не включается в мои представления, но что мне с этим делать?

Ответы [ 4 ]

42 голосов
/ 10 мая 2012

Вы можете добавить вспомогательные методы к ApplicationHelper. Убедитесь, что вы используете правильное название модели (в моем случае это :user, представляющее модель User).

def devise_mapping
  Devise.mappings[:user]
end

def resource_name
  devise_mapping.name
end

def resource_class
  devise_mapping.to
end

Обновление 1/28/2014

Основная ветвь Devise показывает, что devise_mapping теперь сохраняется в запросе:

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

И resource_name также имеют псевдоним scope_name. См. devise_controller.rb для получения дополнительной информации.

6 голосов
/ 27 июля 2011

Я понимаю, что этот вопрос довольно старый, но думаю, я понял, почему вы не можете просто сделать это частичным. Часть, которую вы пытаетесь отобразить, является частичной для ссылок, которые отображаются под формой sign_in / sign_up.

Если вы хотите добавить эти ссылки в свое приложение, эта страница в вики Devise покажет вам, как это сделать, и включает в себя создание ваших собственных частей.

РЕДАКТИРОВАТЬ (2019-04-01): Копирование информации со страницы вики Devise здесь для сохранения.

Как: добавить ссылки sign_in, sign_out и sign_up в шаблон макета

Сначала добавьте ссылки sign_in / out, чтобы отображалась соответствующая ссылка в зависимости от того, вошел ли пользователь в _already_:
# 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 %>
Часть
method: :delete требуется, если вы используете метод HTTP по умолчанию. Чтобы изменить это, вам нужно сказать Devise:
# config/initializers/devise.rb
  # The default HTTP method used to sign out a resource. Default is :delete.
  config.sign_out_via = :get
Затем вы можете опустить method: :delete на всех ваших ссылках выхода. Далее идут ссылки на sign_up. Опять же, они могут быть заменены чем-то еще полезным, если пользователь уже вошел в систему:
# 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 %>
Затем используйте эти шаблоны в вашем layouts/application.html.erb, например:
# layouts/application.html.erb
<ul class="hmenu">
  <%= render 'devise/menu/registration_items' %>
  <%= render 'devise/menu/login_items' %>
</ul>
<%= yield %>
Добавьте немного стиля меню в CSS (здесь для горизонтального меню):
ul.hmenu {
  list-style: none; 
  margin: 0 0 2em;
  padding: 0;
}

ul.hmenu li {
  display: inline;  
}
2 голосов
/ 07 декабря 2011

Вместо использования devise_mapping вы можете использовать Devise.mappings[:user], учитывая, что рассматриваемый класс пользователя - Пользователь.

0 голосов
/ 20 января 2011

У вас есть вызов devise_for в вашем файле rout.rb?

Например, если вы используете его для своего класса User, тогда маршрут будет:

devise_for: пользователи

для получения дополнительной информации см. https://github.com/plataformatec/devise

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...