0

こんにちは 現在、アルバムを作成するためのフォームを送信すると、コントローラでエラーが発生します。これは私の最初のプロジェクトであり、コントローラーと、どのパラメーターを配置し、何をインスタンス変数に設定するかについてかなり不安定です...助けてください!!

new.html.erb フォームを送信すると、

ActiveRecord::AlbumsController#create の RecordNotFound

ID のないユーザーが見つかりませんでした

ここに私の albums_controller があります

class AlbumsController < ApplicationController

    def index
      @albums = Albums.all

      respond_to do |format|
        format.html
        format.json { render json: @albums }
      end
    end

    def show
      @albums = Album.all
      @album = Album.find(params[:id])
      @photo = Photo.new
    end

    def update
    end

    def edit
    end

    def create
      @user = User.find(params[:user_id])
      @user.album = Album.new(params[:album])
      respond_to do |format|
        if @user.album.save
          format.html { redirect_to @user, 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 new
      @user = User.find(params[:user_id])
      @album = Album.new
    end

    def destroy
    end


end

ここに私が提出しているフォームがあります

<%= form_for (@album), :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 %>

さらにファイルが必要な場合はお知らせください。

4

1 に答える 1

1

createメソッドでは、に基づいてデータベースからユーザーを取得しようとしていますが、params[:user_id]params には が含まれていませんuser_id。この場合、URLから取得する必要があると思います

したがって、アルバムがユーザーに属している場合の1つの解決策は、次のようにルートを設定することです:

resources :users do
  resources :albums
end

次に、URL を明示的に指定してアルバムがユーザーの下にネストされていることをフォームに伝える必要があります。user_albums_pathマッチ/users/:user_id/albums(.:format)

<%= 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 %>

create メソッドは、params で必要な user_id を受け取ります。

十分に明確でない場合、またはさらに説明が必要な場合はお知らせください

ここで定義されているビルド方法を使用する必要があります

  @user = User.find(params[:user_id])
  @user.album = Album.new(params[:album])

アルバムを作成するには、

  @user = User.find(params[:user_id])
  @user.albums.build params[:album])

これにより、アルバムの user_id 属性が @user.id に自動的に設定されます。何もする必要はありません。

だからあなたの作成方法は

def create
  @user = User.find(params[:user_id])
  @album = @user.albums.build params[:album]
  respond_to do |format|
    if @album.save
      format.html { redirect_to user_path(@user), notice: 'Album was successfully created.' }
      format.json { render json: @album, status: :created, location: @album} # I don't know what this location is 
    else
      format.html { render action: "new" }
      format.json { render json: @album.errors, status: :unprocessable_entity }
    end
  end 
end
于 2012-10-01T19:27:10.260 に答える