2009-11-22 2 views
1

Je suis des exemples de formes complexes d'alliages de github essayant d'apprendre des formes imbriquées et je n'arrive pas à faire fonctionner cette chose. http://github.com/alloy/complex-form-examplesNoMethodError dans les projets # new

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 

Quelqu'un a des conseils? J'ai essayé d'obtenir des formulaires imbriqués pour travailler toute la journée et j'ai échoué.

projectsController

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 
+0

Pouvez-vous nous montrer ce qu'il y a dans votre ProjectsController? – agregoire

+0

added ProjectsController – Jason

Répondre

3

Votre author_form a besoin d'un auteur pour travailler avec. Soit vous construisez juste avant la ligne 13:

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

Ou vous construisez dans votre ProjectsController:

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

    @project.build_author unless @project.author 
end 

BTW, que "@ project.build_author moins @ project.author" était dans les fichiers d'origine pour des exemples de formes complexes. Vous l'avez peut-être supprimé en les éditant.

+0

Fonctionne, merci! – Jason

+0

question: J'ai essayé d'ajouter @ project.author.build mais cela n'a pas fonctionné. Pourquoi utilisez-vous .build_author sur celui-ci? Est-ce parce que le projet appartient à l'auteur? – Jason

+1

@ project.author.build appelle la méthode de construction sur l'auteur du projet. Comme votre projet n'a pas d'auteur, il essaie d'appeler "build" sur nil. Ce qui ne marche pas. La méthode build_author est ajoutée à votre modèle Project par ActiveRecord via la relation belongs_to. (Lisez à ce sujet ici: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference) – agregoire