ruby on rails - link_to - ¿Cómo encaminar desde un recurso anidado en rieles? Obteniendo ''ActiveRecord:: RecordNotFound in UsersController#show''
rails routes root (3)
Tengo una pantalla de juego, con un enlace para regresar a la página de estadísticas de los jugadores. Mi ID de usuario de prueba es 0 y el ID de mina es 1.
Entonces, la url de la pantalla del juego es /users/0/mines/1
El botón desde el juego hasta las estadísticas del jugador se ve así:
<%= link_to "Home", user_path, id: ''link-to-hq'' %>
User_path parece ser correcto, pero cuando hago clic en él, aparece el siguiente error:
Couldn''t find User with ''id''=1
def find_user
@user = User.find(params[:id])
end
(Este es mi método de búsqueda de usuario privado desde el controlador de mi usuario.) Por alguna razón, está tomando el ID de MINES (de 1), no el ID de usuario (de 0)!
La ruta que uso es esta:
user GET /users/:id(.:format) users#show
mi controlador se ve así:
# 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)
¿Debo hacer una ruta personalizada para tomar esa identificación de usuario cuando regrese a las estadísticas de usuario del juego? ¿Cómo puedo obtener la identificación correcta?
Deberías:
@user = User.find(params[:user_id])
en tu controlador.
No pude cambiar la forma en que encontré al usuario, porque en otras partes de mi programa, estoy buscando al usuario usando:
@user = User.find(params[:id])
Descubrí que especificar @ usuario en mi enlace_ fuera del estado del juego resolvió el problema:
<%= link_to "Home", user_path(@user), id: ''link-to-hq'' %>
me lleva a
/users/0
Sólo para elaborar en @Marek Lipka
respuesta. Si ejecuta rutas de rake en su terminal, puede ver que su ruta es algo así como:
/users/:user_id/mines/:id => mines#show
Entonces en tu controlador cuando estás haciendo params[:id]
está buscando el ID de las minas y no el ID de los usuarios. Entonces en tu método deberías tener
def find_user
@user = User.find(params[:user_id]) #this will give you the user with id 0
end
También notó un par de cosas que está haciendo mal en su acción de presentación, ya que tiene find_user como filtro anterior, por lo que no necesita volver a configurar @user en su show action, también si desea mostrar la mina correcta, entonces debe encontrar con params [: id] para que en tu acción de programa tu código sea como:
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