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 methodphotos_path' for #<#: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 リクエストがcreateアクションのために行く場所だからです。残念ながら、現在のルートに基づいて存在しない/photosに投稿しています。

そのフォーム ヘルパー行を次のように変更した場合:

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

これにより、新しい写真を作成する/users/(user id)/albums/(album id)/photosに投稿されます。

于 2012-10-03T15:51:41.997 に答える