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]) 行にあります。

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
4

2 に答える 2

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 に答える
0

これは、create メソッドでリダイレクトする方法が原因です。その場合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」、「/albums/:id」などのアルバムのルートを宣言しています。彼の回答で言及されていることを実行するか、さらに良いことに、写真のルートをスコープするだけです。

scope "/album" do
  resources :photos
end
于 2012-10-03T06:40:22.430 に答える