2013-08-08 19 views
17

Attualmente sto insegnando a me stesso qualche RoR e faccio il tutorial, ma aggiungo un layout più bello e roba con bootstrap e sto correndo in un problema che non posso risolvere."metodo non definito errori" per nil: NilClass "quando si chiama il metodo degli errori

Io sto cercando di fare la parte di convalida (http://guides.rubyonrails.org/getting_started.html#adding-some-validation), ma quando uso:

<% @post.errors.any? %> 

ottengo questo messaggio:

undefined method `errors' for nil:NilClass 
Extracted source (around line #9): 
<legend><h1>Add Post</h1></legend> 

<%= form_for :post, url: posts_path, html: {class: 'form-horizontal'} do |f| %> 
     <% if @post.errors.any? %> 
     <div id="errorExplanation"> 

Nulla funziona e ho anche copiato e incollato le parti dal tutorial.

ecco il codice per la vista:

<p> </p> 

<div class="span6" 

<fieldset> 
    <legend><h1>Add Post</h1></legend> 

    <%= form_for :post, url: posts_path, html: {class: 'form-horizontal'} do |f| %> 
      <% if @post.errors.any? %> 
      <div id="errorExplanation"> 

       <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2> 

       <ul> 
        <% @post.errors.full_messages.each do |msg| %> 
        <li><%= msg %></li> 
        <% end %> 
        </ul> 
      </div> 
    <% end %> 
     <div class="control-group"> 
      <%= f.label :title, :class => 'control-label' %> 
      <div class="controls"> 
       <%= f.text_field :title, :class => 'span4' %> 
      </div> 
     </div> 

     <div class="control-group"> 
      <%= f.label :content, :class => 'control-label' %> 
      <div class="controls"> 
       <%= f.text_area :content, :rows => '7', :class => 'input-block-level' %> 
      </div> 
     </div> 

     <div class="form-actions"> 
      <%= f.submit "Add Post", :class => 'btn btn-success' %> 
      <%= link_to "Cancel", posts_path, :class => 'btn', :style => 'float:right;' %> 
     </div> 
    <% end %> 
</fieldset> 

</div> 

E il mio posts_controller:

class PostsController < ApplicationController 

    def new 
    end 

    def create 
     @post = Post.new(params[:post].permit(:title, :content)) 

     if @post.save 
      redirect_to @post 
     else 
      render 'new' 
     end 
    end 

    def show 
     @post = Post.find(params[:id]) 
    end 

    def index 
     @posts = Post.order("created_at desc") 
    end 

    private 
     def post_params 
      params.require(:post).permit(:title, :content) 
     end 

end 

Che cosa mi manca? Grazie in anticipo!

risposta

51

È necessario definire anche @post nell'azione new.

def new 
    @post = Post.new 
end 

che stai ricevendo l'errore NilClass perché @post non ha alcun valore nil) prima volta che si carica il modulo sull'azione new.

Quando si esegue l'render :new nella vostra create azione c'è alcun problema perché sta utilizzando il @post avete definito nella parte superiore del create.

+0

@Deefour Hi. Sto facendo lo stesso tutorial e ho lo stesso errore in '5.12 Updating Posts'. La variabile '@ post' è definita nel nuovo metodo e continua a generare questo errore. Mi puoi aiutare? – Demnogonis

+0

Ho avuto lo stesso problema. È davvero confuso poiché la parte superiore del tutorial non menziona esplicitamente che è necessario scrivere . Novità nella Nuova azione. – DennyHiu

1

Aggiornare il metodo di creazione nel file posts.controller.rb con la parte di codice riportata di seguito. Ha funzionato per me.

def create 
    @post = Post.new(params[:post].permit(:title, :text)) 
    @post.save 
    redirect_to @post 
end 
-2
def new 
    @article = Article.new 
end 
Problemi correlati