Что такое переменная devise_mapping и как ее включить?
Я пытаюсь реализовать аутентификацию с помощью 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 не входит в мои представления, но что мне делать с ней?
Ответы
Ответ 1
Я понимаю, что этот вопрос довольно старый, но, думаю, я понял, почему вы не можете просто сделать это частичным. Часть, которую вы пытаетесь отобразить, является частичной для ссылок, которые отображаются под формой sign_in/sign_up.
Если вы хотите добавить эти ссылки в свое приложение, эта страница в вики Devise покажет вам, как это сделать, и она включает в себя создание ваших собственных частей.
РЕДАКТИРОВАТЬ (2019-04-01): Копирование информации со страницы вики Devise здесь для сохранения.
Как: добавить ссылки sign_in, sign_out и sign_up в шаблон макета
Сначала добавьте ссылки sign_in/out, чтобы отобразилась соответствующая ссылка в зависимости от того, вошел ли пользователь в систему:
# 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 <code>method: :delete</code> part is required if you use the
default HTTP method. To change it, you will need to tell Devise this:
'''ruby
# 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 %> '''
Add some menu styling to the CSS (here for a horizontal menu):
'''css ul.hmenu { list-style: none; margin: 0 0 2em; padding:
0; }
ul.hmenu li { display: inline; } '''
Ответ 2
Вы можете добавить вспомогательные методы к 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.
Ответ 3
Вместо использования devise_mapping
вы можете использовать Devise.mappings[:user]
, учитывая, что пользовательский класс является пользователем.
Ответ 4
У вас есть вызов devise_for в файле routes.rb?
Например, если вы используете его для своего класса User, то маршрут будет следующим:
devise_for: users
для получения дополнительной информации см. https://github.com/plataformatec/devise