Rails:空嵌套资源包含带有nil-initialized字段的隐式条目

时间:2012-09-02 10:08:13

标签: ruby-on-rails

尝试将嵌套资源(名为'folders')索引嵌入到父(名为'user')'show'查看器中,我发现了一个问题。在进行数据库创建/迁移之后(当尚未对'folders'表进行任何显式操作时),我创建用户条目。创建之后,此用户的“show”方法显示了一个字段为NilClass的文件夹。一个条目,无论显示哪个用户,默认情况下它始终包含此Nil-ed条目。我可以添加其他条目,但始终会显示此条目。

还有一个有趣的事情:在rails console @ user.folders中返回空数组并且其#each方法运行良好(即在控制台中所有工作都正常,此问题不会出现在那里)。

这是嵌套资源的'create'方法:

class FoldersController < ApplicationController
  def create
    @user = User.find params[:user_id]
    @user.folders.create params[:folder]
    redirect_to user_path @user
  end

users / show.html.haml - 父查看器(用户信息输出被切断以使代码更容易阅读):

Add a folder:
=form_for [ @user, @user.folders.build] do |f|
  .field
    =f.label :name
    =f.text_field :name
  .actions
    =f.submit

%br
User's folders:
%table
  %tr
    %th Name
    %th
    %th
  -@user.folders.each do |folder| # Will make at least one iteration even if 
                                  # no entries have been created yet. Works  
                                  # properly in rails console
      %tr
        %td= folder.name.class ## here will be NilClass in that default entry
        %td= link_to 'Show', user_folders_path(@user, folder)
        %td= link_to 'Delete', [@user, folder], :confirm => 'Are you sure?', :method => :delete

我是Rails和基于网络的应用程序的新手,所以,如果没有正确描述某些内容,请随时提出问题,并批评编码错误。

UPD: UserController :: create方法:

def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render json: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

1 个答案:

答案 0 :(得分:1)

我刚遇到类似的问题。在您的form_for标签中,您正在使用

@user.folders.build

使用适当的user_id属性将空文件夹记录添加到文件夹对象。

在你的代码中降低你正在迭代相同的文件夹对象,这就是你看到空记录的原因。

如果您只是将表单代码放在文件夹代码表下面,您将看到空记录不再存在(因为它尚未创建!)