Rails:ActiveRecord :: RecordNotFound – 找不到没有ID的用户

我目前正在开发一个上传图片的项目。 这些相册中有用户,相册和图片。 我已经达到了以用户身份创建专辑的程度(尚未完成会话,身份validation或登录,但已完成注册)。 我在表单提交Rails后收到错误

Couldn't find User without an ID

我注意到我的new.html.erb的url没问题:

http://localhost:3000/users/13/albums/new (没问题)

但在我提交之后,它给了我一个错误,页面是:

http://localhost:3000/albums/58 (问题。url中没有user_id)

有谁知道为什么我的路线突然改变了,以及如何解决它? 错误发生在我的app / controllers / albums_controller.rb:14:在`show’中@user = User.find(params [:user_id])行。

new.html.erb

  { :id => "uploadform", :multipart => true } do |f| %> 

albums_controller

 def show @user = User.find(params[:user_id]) @album = @user.albums.find(params[:id]) @photo = @album.photos.build(params[:photo]) respond_to do |format| if @user.save format.html { redirect_to album_photo_path(@album), notice: 'Album was successfully created.' } format.json { render json: @album, status: :created, location: @album} else format.html { render action: "new" } format.json { render json: @album.errors, status: :unprocessable_entity } end end end def update end def edit end def create @user = User.find(params[:user_id]) @album = @user.albums.build(params[:album]) respond_to do |format| if @user.save format.html { redirect_to @album, notice: 'Album was successfully created.' } format.json { render json: @album, status: :created, location: @album} else format.html { render action: "new" } format.json { render json: @album.errors, status: :unprocessable_entity } end end end 

路线

 Pholder::Application.routes.draw do resources :users do resources :albums end resources :albums do resources :photos end 

这是因为您在create方法中重定向的方式。 当您执行redirect_to @album它使用对象,其状态和方法来查找重定向到的正确路径。 例如@album.persisted? 并且方法是GET,然后路径将是album_path 。 如果没有持久化,那么它将是new_album_path

如果您同时添加User对象,那么它将使用正确的ID评估user_album_path的路径。

 format.html { redirect_to [@user, @album], notice: 'Album was successfully created.' } 

您的路线也可以做得更好。 通过指定

 resources :albums do resources :photos end 

当您已通过嵌套的user_album路由指定了对Albums资源的访问权限时,您实际上正在声明相册的路线,例如“/ albums”,“/ albums /:id”等。 要么做他的答案中提到的surase ,要么更好, 只是确定照片路线的范围 :

 scope "/album" do resources :photos end 

您可以指定已定义的嵌套路由(仅深度为2级),但这会增加混淆。 最好指定为:

 resources :users do resources :albums do resources :photos end end 

结帐http://guides.rubyonrails.org/routing.html#nested-resources