3

嗨,我目前正在使用嵌套资源。

路线

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

我有 3 个模型(用户、相册、照片)。我已经成功地注册了用户并创建了相册,但我一直在尝试为照片制作表单。在创建相册时,用户被重定向到相册/显示页面:

专辑/节目

<% if @album.photos.any? %>
yes  pics
<% else %>
no  pics
<% end %>


<%= link_to "Upload new pics!", new_user_album_photo_path(@user, @album) %>

如您所见,在页面底部有一条通往新照片的路径,这就是问题所在。当我点击链接时,它给了我一个错误:

undefined method#<#:0x007fb69e167220> 的照片路径'`

错误发生在该页面的第 3 行(照片/新)

照片/新

<% provide(:title, "Upload pictures") %>

<%= form_for(@photo, :html => { :multipart => true }) do |f| %>

<%= f.file_field :photo %>

<% end %>

我怀疑我向控制器输入了错误的信息(我仍然对在控制器中放入什么感到非常不安。)?这是我的照片控制器。

照片控制器

class PhotosController < ApplicationController

    def new
      @user = User.find(params[:user_id])
      @album = @user.albums.find(params[:album_id])
      @photo = @album.photos.build
    end

    def create
      @album = Album.find(params[:album_id])
      @photo = @album.photos.build(params[:photo])
      respond_to do |format|
        if @album.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

    def show
      @album = Album.find(params[:album_id])
      @photos = @album.photos
    end


end

我的表格不正确吗?将什么放入控制器以及错误发生在表单还是控制器中,这让我感到困惑。谢谢

如果您需要更多信息,请告诉我。

4

2 回答 2

5

与您必须向link_to助手提供父资源相同的方式,您还必须将其提供给表单。因此,将表单行更改为:

 <%= form_for([@user, @album, @photo], :html => { :multipart => true }) do |f| %>

..它应该工作!

于 2012-10-03T15:45:20.803 回答
2

所以这里发生的事情是 Rails 正在使用一些反射来查看您传递给表单助手的对象,(我猜)它只是一个 Photo 对象。默认情况下,Rails 将查找photos_path,因为这是 POST 请求通常用于创建操作的地方。所以它发布到/photos,不幸的是,根据您当前的路线不存在。

如果您将该表单助手行更改为:

<%= form_for [@user,@album,@photo], html: { multipart: true} do |f| %>

这导致它发布到/users/(user id)/albums/(album id)/photos应该创建新照片。

于 2012-10-03T15:51:41.997 回答