【问题标题】:Rails: ActiveRecord::RecordNotFound in AlbumsController#create Couldn't find User without an IDRails:ActiveRecord::RecordNotFound in AlbumsController#create 找不到没有 ID 的用户
【发布时间】:2012-10-02 03:59:58
【问题描述】:

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

在提交我的 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 %>

如果您需要更多文件,请告诉我。

【问题讨论】:

  • create 操作的第一行试图根据user_id 请求参数查找User。但我在您的表单中没有看到任何提及user_id
  • 嘿jdoe。我会在哪里引用 user_id 在我的表单中?

标签: ruby-on-rails


【解决方案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。

如果不够清楚或者需要更多解释,请告诉我

你应该使用here定义的构建方法

  @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

【讨论】:

  • 嗨睡!你所说的关于 url 的内容是我所需要的,因为它还有助于更改 url 以包含 user_id。但是,我的控制器仍然收到错误...我很确定我的控制器也有问题,因为我不知道我在那里输入了什么。我的实例变量是否定义不正确?
  • 嗯,我再检查一遍,你得到的错误是什么?还是一样?
  • 创建新专辑时,应该使用albums.build方法(这里有更多解释:api.rubyonrails.org/classes/ActiveRecord/Associations/…@user.albums.build params[:album]
  • 我也从来没有像你那样使用过redirect_to model_instance,你应该试试redirect_to user_path而不是
  • 好的,我会改变它。你能解释一下url: user_albums_path 属性的实际作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多