如何从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