如何从rails中的嵌套资源进行路由? 在UsersController#show中获取’ActiveRecord :: RecordNotFound’

我有一个游戏屏幕,其中包含一个返回玩家统计页面的链接。 我的测试用户ID为0,我的地址为1。

所以游戏界面的url是/users/0/mines/1

从游戏玩法回到玩家统计数据的按钮如下所示:

  

User_path似乎是正确的,但当我点击它时,我有错误:

 Couldn't find User with 'id'=1 def find_user @user = User.find(params[:id]) end 

(这是我用户控制器的私有查找用户方法。)出于某种原因,它抓取MINES id(1),而不是用户id(0)!

我使用的路线是这样的:

 user GET /users/:id(.:format) users#show 

我的控制器看起来像这样:

 # This is 'Headquarters', HQ... def show @user = User.find(params[:id]) @mine = @user.mines.first @tool = Tool.find(@user.tool_id) end private def find_user @user = User.find(params[:id]) end 

(i have a before_action :find_user :show)

从游戏玩法回到用户统计数据时,我是否需要制作自定义路线以获取该用户ID? 我怎样才能获得正确的ID?

只是详细说明@Marek Lipka答案。 如果您在终端中运行rake路线,您可以看到您的路线如下:

 /users/:user_id/mines/:id => mines#show 

所以在你的控制器中,当你做params[:id]它正在寻找地雷ID而不是用户ID。 所以在你的方法中你应该有

 def find_user @user = User.find(params[:user_id]) #this will give you the user with id 0 end 

还注意到你在show动作中出现了一些错误,因为你有find_user作为之前的filter,所以你不需要在你的show动作中再次设置@user如果你想显示正确的我的那么你应该找到它与params [:id]所以在你的show动作中你的代码应该像:

 def show @mine = Mine.find(params[:id]) #this will show mine with id 1 or whichever id you'll pass in url @tool = Tool.find(@user.tool_id) end 

你应该有:

 @user = User.find(params[:user_id]) 

在你的控制器中。

我无法改变我找到用户的方式,因为在我的程序的其他部分,我通过使用以下方式找到用户:

@user = User.find(params[:id])

我发现在游戏状态中指定我的link_to中的@ user解决了这个问题:

<%= link_to "Home", user_path(@user), id: 'link-to-hq' %>

带我去

/users/0