Rails错误resource_name – 设计帮助路由和呈现

我正在尝试渲染Devise gem的登录视图,但是我收到一个错误,下面是我目前的代码:

这是我的views/users/shared/_links.html.erb

  





我的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 

在我的应用程序布局中:

  

我在_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 #<#:0x5db6538> Extracted source (around line #2): 1:  2: 
3: 4: 5: 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 

任何帮助将不胜感激,谢谢!

resource_name在Devise生成的控制器中定义。 我不认为您可以在应用程序布局中包含这些共享链接,我认为它们旨在用于设计表单(注册,会话,密码,确认等),这些表单由设计控制器呈现。

如果您希望每个页面都有很少的登录/退出片段,您可能需要考虑自己编写这些链接。 例如,如果您正在使用的对象是user ,则可以这样写:

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

resource_name只是您正在使用的资源的Devise抽象。 我希望如果你正在建立这个链接,你知道你想要登录哪个经过身份validation的对象,所以你可以明确地指定它。 你可以运行rake routes | grep sessions rake routes | grep sessions并查看路径的名称并直接使用它。 例如:

 <%= link_to "Sign in", new_user_session_path %>

问题是您的routes.rb文件中定义了一个名为sessions的资源,而routes.rb也有一个具有相同名称的资源。

解决方案很简单,只需删除resources :sessions来自路径文件的resources :sessions ,一切都应该有效。

发生这种情况的原因是rails为所有资源创建了路由助手。 因此它创建了一个名为new_session_path(format)的路由助手。 但是设计也会创建一个名为new_session_path(resource_name)的辅助方法。 设计版本返回路径new__session_path 。 换句话说,路由文件生成的助手会覆盖设计中的助手。

请注意,如果您执行以下操作,也会发生这种情况:

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

在这种情况下,解决方案是分别用loginlogout替换new_sessiondestroy_session