为什么这个链接没有标记链接到正确的模型?

时间:2011-03-24 02:12:49

标签: ruby-on-rails rails-models

所以把头发拉了一个小时后,我决定在这里张贴。我收到这个错误:

NoMethodError in Articles#show

Showing /home/leon/sites/VIS/app/views/articles/_article.html.erb where line #3 raised:

undefined method `user_path' for #<#<Class:0x7fdd81fe1eb8>:0x7fdd81fdfdc0>
Extracted source (around line #3):

1: <div id="left-column">
2:  <p class="label-b">Author<br>
3:     <%= link_to "#{@article.user.penname}'s profile", user_path(article.user) %> 

user_path(article.user)%&gt;

当我尝试链接到文章的创作用户时。我的路线档案:

  resources :tags

  get "admin/index"
  get "admin/show"
  get "articles/contact"
  get "articles/about"

  resources :roles

  devise_for :users, :controllers => { :registrations => "users/registrations" }

  resources :articles do
    resources :comments
  end

我的文章模型文件中有belongs_to:user,我的用户模型文件中有一个has_many:文章。我正在使用此链接链接到文章中作者的个人资料。

请帮忙!我正在使用可以为我的权限管理和设计我的身份验证,但它在文章的show动作中抛出错误,所以我没有发布该代码。如果我应该告诉我。谢谢!

@Jacob

我得到同样的错误:

文章中的NoMethodError#show

显示/home/leon/sites/VIS/app/views/articles/_article.html.erb第3行:

#&lt;#:0x7fdd82217a98&gt;的未定义方法`user_path' 提取的来源(第3行):

1: 2:作者
3:&lt;%= link_to“#{@article.user.penname}的个人资料”,article.user%&gt; 4:先前版本 5:版本7

6:&lt;%= image_tag“add-to-favorites.png”,:class =&gt; “收藏夹 - 按钮”%&gt;

我路线的相关部分:

{:action=>"destroy", :controller=>"roles"}
      new_user_session GET    /users/sign_in(.:format)                          {:action=>"new", :controller=>"devise/sessions"}
          user_session POST   /users/sign_in(.:format)                          {:action=>"create", :controller=>"devise/sessions"}
  destroy_user_session GET    /users/sign_out(.:format)                         {:action=>"destroy", :controller=>"devise/sessions"}
         user_password POST   /users/password(.:format)                         {:action=>"create", :controller=>"devise/passwords"}
     new_user_password GET    /users/password/new(.:format)                     {:action=>"new", :controller=>"devise/passwords"}
    edit_user_password GET    /users/password/edit(.:format)                    {:action=>"edit", :controller=>"devise/passwords"}
         user_password PUT    /users/password(.:format)                         {:action=>"update", :controller=>"devise/passwords"}
     user_registration POST   /users(.:format)                                  {:action=>"create", :controller=>"users/registrations"}
 new_user_registration GET    /users/sign_up(.:format)                          {:action=>"new", :controller=>"users/registrations"}
edit_user_registration GET    /users/edit(.:format)                             {:action=>"edit", :controller=>"users/registrations"}
     user_registration PUT    /users(.:format)                                  {:action=>"update", :controller=>"users/registrations"}
     user_registration DELETE /users(.:format)                                  {:action=>"destroy", :controller=>"users/registrations"}
     user_confirmation POST   /users/confirmation(.:format)                     {:action=>"create", :controller=>"devise/confirmations"}
 new_user_confirmation GET    /users/confirmation/new(.:format)                 {:action=>"new", :controller=>"devise/confirmations"}
     user_confirmation GET    /users/confirmation(.:format)                     {:action=>"show", :controller=>"devise/confirmations"}

啊哈!它没有用户#show的路由,但我不确定为什么我有:

class UsersController < ApplicationController
...
  def show
    respond_to do |format|
      format.json { render :json => @user }
      format.xml  { render :xml => @user }
      format.html
    end

  rescue ActiveRecord::RecordNotFound
    respond_to_not_found(:json, :xml, :html)
  end

在我的app / controllers文件夹中。我是否需要将用户控制器移动到app / controllers / devise并使用devise而不是应用程序控制器将其重载?

4 个答案:

答案 0 :(得分:1)

你可以这样做:

 <%= link_to "#{@article.user.penname}'s profile", article.user %> 

Rails会自动确定路线。

如下所示:

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

<强>更新

是的,您将不得不继承DeviseController而不是ApplicationController。在这里,您可以添加自己的自定义操作,例如show(这就是您现在正在做的事情)。

请注意:https://github.com/plataformatec/devise

并搜索:配置控制器

答案 1 :(得分:0)

尝试使用article.user代替user_path(article.user)。如果这不起作用,您可以发布rake routes的输出吗?

答案 2 :(得分:0)

我明白了。在玩了一段时间的路线并阅读rails文档后,我将此行添加到我的路线文件中:

devise_for:users,:controllers =&gt; {:registrations =&gt; “用户/注册”}

资源:users,:only =&gt; [:index,:show]&lt; ==此行

低于我的devise_for路线。这允许我显示用户配置文件,而不必担心设计提供的编辑更新等角色。无论如何,谢谢你的回答,我很感激!

答案 3 :(得分:0)

不应该只是:@article.user而不是article.user ??

<%= link_to "#{@article.user.penname}'s profile", @article.user %>

为什么要为用户penname使用实例变量,为用户对象使用局部变量?我认为这是你的问题。