0

嗨,我目前在提交创建相册的表单时在控制器中收到错误消息。这是我的第一个项目,我对控制器以及要放置的参数以及将实例变量设置为的内容非常不稳定......请帮助!

在提交我的 new.html.erb 表单时,我收到

ActiveRecord::RecordNotFound in AlbumsController#create

找不到没有 ID 的用户

这是我的相册控制器

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

因此,如果专辑属于用户,一种解决方案是像这样设置您的路线:

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 方法会在参数中收到它需要的 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 回答