【问题标题】:Rails: ActiveRecord::RecordNotFound - Couldn't find User without an IDRails:ActiveRecord::RecordNotFound - 找不到没有 ID 的用户
【发布时间】:2015-04-14 18:24:44
【问题描述】:

我目前正在做一个上传图片的项目。这些相册中有用户、相册和图片。我已经到了以用户身份创建相册的地步(尚未完成会话、身份验证或登录,但已完成注册)。我在提交 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:in `show' @user = User.find(params[:user_id]) 行中。

new.html.erb

<%= form_for (@album), url: user_albums_path, :html => { :id => "uploadform", :multipart => true } do |f| %>
<div>
    <%= f.label :name %>
    <%= f.text_field :name %>


    <%= f.label :description %>
    <%= f.text_area :description %>

    <br>

    <%=f.submit %>
</div>
<% end %>

相册控制器

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

【问题讨论】:

  • 你看到这个答案了吗? stackoverflow.com/questions/1303980/…
  • 是的,我已经看到了,但它对我没有任何作用。同样的错误
  • 我认为问题在于我在专辑#create 上的重定向...
  • 如何重定向到嵌套资源? redirect_to user_album_path(@user) 和 redirect_to user_album_path(@album) 给了我错误,因为我插入了整个对象而不仅仅是 id

标签: ruby-on-rails


【解决方案1】:

这是因为您在创建方法中重定向的方式。当您执行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/:id”等。要么做surase mentioned in his answer,或者更好,just scope your photos route:

scope "/album" do
  resources :photos
end

【讨论】:

    【解决方案2】:

    您可以按照您的定义指定嵌套路由(只有 2 层深),但这会增加混乱。最好指定为:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多