首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Projects#new中的NoMethodError

Projects#new中的NoMethodError
EN

Stack Overflow用户
提问于 2009-11-23 05:43:23
回答 1查看 816关注 0票数 1

我正在遵循来自github的合金-复杂-表单-示例,试图学习嵌套表单,但我就是不能让它工作。http://github.com/alloy/complex-form-examples

代码语言:javascript
复制
NoMethodError in Projects#new

Showing app/views/projects/_form.html.erb where line #13 raised:

You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.new_record?

Extracted source (around line #13):

10:   </p>
11:   
12:   <p>
13:     <% project_form.fields_for :author do |author_form| %>
14:       <%= author_form.label :name, "Author name:" %>
15:       <%= author_form.text_field :name %>
16:       

Trace of template inclusion: app/views/projects/new.html.erb

class Comment < ActiveRecord::Base
  belongs_to :post
end


class Post < ActiveRecord::Base
  validates_presence_of :name, :title  
  validates_length_of :title, :minimum => 5 
  has_many :comments
  has_many :tags

  accepts_nested_attributes_for :tags, :allow_destroy => :true ,  
    :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
end

class Tag < ActiveRecord::Base
  belongs_to :post
end

有人有什么建议吗?我整天都在尝试让嵌套表单工作,但没有成功。

projectsController

代码语言:javascript
复制
class ProjectsController < ApplicationController
  def index
    @projects = Project.find(:all)
  end

  def show
    @project = Project.find(params[:id])
  end

  def new
    @project = Project.new
    @project.tasks.build
    @project.tags.build
  end

  def create
    @project = Project.new(params[:project])
    if @project.save
      flash[:notice] = "Successfully created project."
      redirect_to @project
    else
      render :action => 'new'
    end
  end

  def edit
    @project = Project.find(params[:id])
    # add an extra new record for debugging purposes
    @project.tasks.build
    @project.tags.build
  end

  def update
    @project = Project.find(params[:id])
    @project.attributes = params[:project]
    if @project.save
      flash[:notice] = "Successfully updated project."
      redirect_to @project
    else
      render :action => 'edit'
    end
  end

  def destroy
    @project = Project.find(params[:id])
    @project.destroy
    flash[:notice] = "Successfully destroyed project."
    redirect_to projects_url
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-11-23 07:00:34

您的author_form需要一个作者与之合作。要么在第13行之前构建它:

代码语言:javascript
复制
<% @project.build_author unless @project.author %>
<% project_form.fields_for :author do |author_form| %>
  <%= author_form.label :name, "Author name:" %>
  <%= author_form.text_field :name %>

或者在您的ProjectsController中构建它:

代码语言:javascript
复制
def new
  @project = Project.new
  @project.tasks.build
  @project.tags.build

  @project.build_author unless @project.author
end

顺便说一句,"@project.build_author除非@project.author“出现在复杂形式示例的原始文件中。您可能在编辑它们时将其删除。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1780095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档