Подтвердить что ты не робот

Что такое переменная 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 не входит в мои представления, но что мне делать с ней?

4b9b3361

Ответ 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