2009-07-28 46 views
1

我有一个标准的用户控制器与正常的一套行动(索引,显示,新,编辑等),我试图添加一个名为'配置文件'的新行动。我添加以下代码:新行动不工作

def profile 
    @user = User.find(session[:user_id]) 
end 

我还创建了一个新的视图的动作(应用程序/视图/用户/ profile.html.erb),但每当我尝试查看网页,我得到一个错误:

ActiveRecord::RecordNotFound in UsersController#show 
Couldn't find User with ID=profile 
...

显然它是击中了节目的行动。我猜这意味着我需要添加一些东西到我的路线来完成这项工作,但我不知道是什么。到目前为止,我只是有两个默认路由,这是我的注释掉行map.root:

map.root :controller => "home" 
map.connect ':controller/:action/:id' 
map.connect ':controller/:action/:id.:format' 

因此,其实我有两个问题:

  1. 我有什么为了让做我新的行动?
  2. 为什么现有路线不能覆盖这种情况?其他只由控制器和动作构成的网址就可以工作(例如http://localhost:3000/users/new)。为什么不是这个?它不应该仅仅评估:controller = users,:action = profile,:id = nil?

回答

1

尝试把这样的事情在你的routes.rb文件:

map.user_profile '/users/:id/profile', :controller => "users", :action => 'profile', :conditions => {:method => :get} 

我想可能它这样做的原因是因为你不配套无论是默认的,因为你不设置:ID(即使它正在检测你的行为作为id)。我不知道你的网址是什么样的,但我有一种感觉,如果你尝试http://localhost:3000/users/123124124/profile,即使没有新的路线,它也可能工作。

0

你有意试图从session [:user_id]而不是params [:id]获取id吗?这应该是显示一个公开的个人资料?

+0

在配置文件页面上,我从会话中获取id(它是为当前登录的用户),而在显示页面上,它从params中获取它,因为show可以用于任何用户,而不仅仅是登录的用户。 – Jason 2009-07-28 05:24:28

0

您确定第一次加载页面时会话包含user_id吗?

0

很难说没有看到所有的代码,但我的猜测是可能有一些奇怪,因为你的模型和控制器具有相同的名称。我会尝试在更改其他任何东西之前重命名控制器(请记住更改views/users目录的名称)。

另见本其他堆栈溢出后:Rails cannot find model with same name as Ruby class

长镜头,也许。

0

针对您的问题的解决方案以这样的方式配置您的routes.rb,以便将id作为参数传递。

在routes.rb中配置如下

map.profile '/profile/:id',:controller=>'users',:action=>'profile' 

当您要访问您的个人资料页面中使用它具有以下URL

http://localhost:3000/profile

确保一旦你登录,U处理会话并将用户标识存储在会话变量中。

祝你好运!