Rails ошибка имя_ресурса - разработка справочной маршрутизации и рендеринга - PullRequest
5 голосов
/ 10 мая 2011

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

Это мой views/users/shared/_links.html.erb:

<%- if controller_name != 'sessions' %>
  <%= link_to "Sign in", new_session_path(resource_name) %><br />
<% end -%>

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

<%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
  <%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
  <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
  <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
<% end -%>

<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br />
  <% end -%>
<% end -%>

И мой config/routes.rb:

Densidste::Application.routes.draw do
  match 'user/edit' => 'users#edit', :as => :edit_current_user

  match 'signup' => 'devise/users#new', :as => :signup

  match 'logout' => 'devise/sessions#destroy', :as => :logout

  devise_for :users do
    get "login", :to => "devise/sessions#new"
  end

  resources :sessions

  resources :users

  devise_for :users

  resources :aktivs

  resources :taggingposts

  resources :tags

  resources :kommentares

  resources :posts

  # You can have the root of your site routed with "root"
  # just remember to delete public/index.html.
  root :to => "public#index"
end

И в макете моего приложения:

<%= render("users/shared/links") %>

В частичном _links.html.erb я получаю следующую ошибку:

NameError in Public#index

Showing C:/Rails/Densidste/app/views/users/shared/_links.erb where line #2 raised:

undefined local variable or method `resource_name' for #<#<Class:0x5db76c0>:0x5db6538>

Extracted source (around line #2):

1: <%- if controller_name != 'sessions' %>
2:   <%= link_to "Sign in", new_session_path(resource_name) %><br />
3: <% end -%>
4: 
5: <%- if devise_mapping.registerable? && controller_name != 'registrations' %>

Trace of template inclusion: app/views/public/index.html.erb

Rails.root: C:/Rails/Densidste

Наконец, в моем контроллере приложений у меня есть следующее:

before_filter :resource_name
  def resource_name
    if user_signed_in?
      current_user.name
    else
      :user
    end
  end
end

Любая помощь будет высоко ценится, спасибо!

Ответы [ 2 ]

16 голосов
/ 10 мая 2011

resource_name определяется в сгенерированных контроллерами Devise. Я не думаю, что вы можете включить эти общие ссылки в макет приложения, я думаю, что они предназначены для использования в формах разработки (регистрация, сеансы, пароли, подтверждения и т. Д.), Которые предоставляются контроллерами devise.

Если вы хотите, чтобы на каждой странице было мало фрагментов для входа / выхода, возможно, вы захотите сами написать эти ссылки. Например, если ваш объект, для которого вы используете устройство, является user, вы можете написать это:

<%= link_to "Sign in", new_session_path(:user) %><br />

resource_name - это просто абстракция Devise для ресурса, который вы используете. Я ожидаю, что если вы создаете эту ссылку, вы знаете , который из ваших аутентифицированных объектов, вы хотите войти в систему, так что вы можете указать это явно. Вы также можете запустить rake routes | grep sessions и посмотреть, как называется путь, и использовать его напрямую. Например:

<%= link_to "Sign in", new_user_session_path %><br />
0 голосов
/ 08 октября 2014

Проблема в том, что в вашем файле routes.rb вы определяете ресурс с именем sessions, у devise также есть ресурс с тем же именем.

Решение простое, просто удалите resources :sessionsиз файла маршрутов, и все должно работать.

Причина, по которой это происходит, заключается в том, что rails создает помощники маршрутов для всех ресурсов.Таким образом, он создает помощник маршрута с именем new_session_path (format).Но devise также создает вспомогательный метод с именем new_session_path(resource_name).Версия устройства возвращает путь new_<resouce_name>_session_path.Другими словами, хелперы, сгенерированные файлом маршрутов, переопределяют те, что в devise.

Обратите внимание, что это также может произойти, если вы сделаете что-то вроде:

devise_scope :user do 
  get 'login', :to => 'devise/sessions#new', :as => :new_session
  get 'logout', :to => 'devise/sessions#destroy', :as => :destroy_session
end

В этом случае решениедолжен заменить new_session и destroy_session на login и logout соответственно.

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