0

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

新的.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
4

2 回答 2

0

这是因为您在创建方法中重定向的方式。当你这样做redirect_to @album时,它会使用对象、它的状态和方法来找到重定向到的正确路径。例如,如果@album.persisted?方法是 GET,那么路径就是album_path. 如果不坚持,那么它将是new_album_path.

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

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

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

resources :albums do
  resources :photos
end

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

scope "/album" do
  resources :photos
end
于 2012-10-03T06:40:22.430 回答
0

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

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

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

于 2012-10-03T06:03:58.640 回答