1

我有一个标准的用户控制器,带有一组正常的操作(索引、显示、新建、编辑等),我正在尝试添加一个名为“配置文件”的新操作。我添加了以下代码:

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

我还为该操作创建了一个新视图(app/views/users/profile.html.erb),但是每当我尝试查看该页面时,都会出现错误:

ActiveRecord::RecordNotFound in UsersController#show
找不到 ID=profile 的用户
...

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

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

所以我真的有两个问题:

  1. 为了启用我的新操作,我必须做什么?
  2. 为什么现有的路线不能涵盖这种情况?仅包含控制器和操作的其他 url 工作得很好(例如http://localhost:3000/users/new)。为什么不是这个?它不应该只是评估为:controller = users,:action = profile,:id = nil?
4

5 回答 5

1

尝试在您的 routes.rb 文件中添加类似的内容:

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

我认为它这样做的原因可能是因为您没有匹配任何一个默认值,因为您没有设置 :id (即使它正在检测您的操作作为 id)。我不知道你的 URL 是什么样的,但我有一种感觉,如果你尝试http://localhost:3000/users/123124124/profile,它可能会工作,即使没有路由中的新行。

于 2009-07-28T06:23:20.797 回答
0

您是否有意尝试从 session[:user_id] 而不是 params[:id] 获取 id?这应该显示公共个人资料吗?

于 2009-07-28T05:13:43.027 回答
0

您的问题的解决方案配置您的 routes.rb 以使 id 作为参数传递。

在 routes.rb 中配置如下

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

当您想访问您的个人资料页面时,请使用以下 URL

http://localhost:3000/profile

确保登录后,您处理会话并将用户 ID 存储在会话变量中。

祝你好运 !

于 2009-07-28T16:46:36.557 回答
0

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

于 2009-07-28T08:07:57.527 回答
0

没有看到所有代码很难说,但我猜可能会有一些奇怪,因为您的模型和控制器具有相同的名称。在更改任何其他内容之前,我会尝试重命名控制器(请记住也要更改视图/用户目录的名称)。

另请参阅此其他堆栈溢出帖子:Rails 找不到与 Ruby 类同名的模型

也许是远射。

于 2009-07-28T12:16:14.290 回答