2011-05-10 44 views
5

我试图渲染为制定创业板登陆的看法,但我得到一个错误,下面的代码是我目前有:Rails的错误RESOURCE_NAME - 设计帮助路由和渲染

这是我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 

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

回答

14

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

如果你想在每个页面上有很少的登录/离开片段,你可能要考虑自己写这些链接。举例来说,如果您使用的是设计为你的对象是user,你可以这样写:

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

resource_name只是抽象设计为您所使用的资源。我预计如果你正在创建这个链接,你知道哪个你想要登录的身份验证对象,所以你可以明确地指定它。你可以运行rake routes | grep sessions,看看路径的名字是什么,并直接使用它。例如:

<%= link_to "Sign in", new_user_session_path %><br /> 
+0

我已更新我的问题如何创建一个before_filter:resource_name? – Hans 2011-05-10 19:37:08

+0

我相信'resource_name'通常是类名的下划线版本。你可以试试'current_user.class.name.underscore'。这应该为'User'或'fancy_user'类型的对象给FancyUser类的对象提供'user'。 – andrewmitchell 2011-05-10 23:26:42

+0

在[devise/controllers/url_helpers.rb](https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/url_helpers)中有关于这些“特定于资源”的帮助器方法的一些有用评论。 rb) – 2013-12-27 03:38:43

0

的问题是,在你的routes.rb文件要定义一个名为sessions资源,还设计有一个同名的资源。

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

发生这种情况的原因是因为rails会为所有资源创建路由助手。所以它创建一个称为new_session_path(格式)的路由帮助程序。但设计也创建了一个名为new_session_path(resource_name)的帮助方法。设计版本返回路径new_<resouce_name>_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