首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails error resource_name -设计帮助路由和渲染

Rails error resource_name -设计帮助路由和渲染
EN

Stack Overflow用户
提问于 2011-05-11 03:15:23
回答 3查看 14.4K关注 0票数 7

我正在尝试呈现Devise gem的登录视图,但我得到了一个错误,以下是我当前拥有的代码:

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

代码语言:javascript
复制
<%- 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

代码语言:javascript
复制
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

代码语言:javascript
复制
<%= render("users/shared/links") %>

我在_links.html.erb部分代码中得到以下错误:

代码语言:javascript
复制
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

最后,在我的应用程序控制器中,我有以下内容:

代码语言:javascript
复制
before_filter :resource_name
  def resource_name
    if user_signed_in?
      current_user.name
    else
      :user
    end
  end
end

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-11 03:27:09

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

如果您希望在每个页面中都有少量的登录/注销代码片段,那么您可能需要考虑自己编写这些链接。例如,如果你使用devise的对象是user,你可以这样写:

代码语言:javascript
复制
<%= link_to "Sign in", new_session_path(:user) %><br />

resource_name只是您正在使用的资源的精心设计的抽象。我希望如果您创建这个链接,您应该知道您希望以哪些经过身份验证的对象登录,因此可以显式地指定它。您也可以运行rake routes | grep sessions并查看路径的名称,然后直接使用它。例如:

代码语言:javascript
复制
<%= link_to "Sign in", new_user_session_path %><br />
票数 18
EN

Stack Overflow用户

发布于 2014-10-08 08:49:40

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

解决方案很简单,只需从路由文件中删除resources :sessions,一切都应该正常工作。

之所以会发生这种情况,是因为rails为所有资源创建了路由助手。因此,它创建了一个名为new_session_path(format)的路由助手。但devise还创建了一个名为new_session_path(resource_name)的帮助器方法。devise版本返回一个路径new_<resouce_name>_session_path。换句话说,由routes文件生成的helper会覆盖devise中生成的helper。

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

代码语言:javascript
复制
devise_scope :user do 
  get 'login', :to => 'devise/sessions#new', :as => :new_session
  get 'logout', :to => 'devise/sessions#destroy', :as => :destroy_session
end

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

票数 0
EN

Stack Overflow用户

发布于 2020-07-27 18:50:16

您可以通过将您的app/views/devise/confirmation/new.html文件替换为

https://github.com/heartcombo/devise/pull/3684/files

通过以上链接中的文件app/views/devise/confirmation/new.html,您可以从以上链接中找到此文件并将其替换为您的文件,因为最近的版本中有一些更改,因此请访问以上链接并从以上链接中找到app/views/devise/confirmation/new.html文件并将其替换为您的项目文件app/views/devise/confirmation/new.html文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5955224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档