web-dev-qa-db-fra.com

"méthode non définie` erreurs 'pour nil: NilClass "lors de l'appel à la méthode des erreurs

Je m'apprends actuellement quelques RoR et je fais le tutoriel, mais j'ajoute une mise en page et des trucs plus agréables avec bootstrap et je rencontre un problème que je ne peux pas comprendre.

J'essaie de faire la partie validation ( http://guides.rubyonrails.org/getting_started.html#adding-some-validation ), mais quand j'utilise:

<% @post.errors.any? %>

Je reçois ce message:

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">

Rien ne fonctionne et j'ai même copié et collé les parties du tutoriel.

Voici le code de la vue:

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

Et mon 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

Qu'est-ce que je rate? Merci d'avance!

21
tomr

Vous devez définir @post dans votre action new également.

def new
  @post = Post.new
end

Vous obtenez l'erreur NilClass car @post n'a aucune valeur (c'est nil) lors du premier chargement du formulaire sur l'action new.

Lorsque vous effectuez le render :new dans votre action create il n'y a pas de problème car il utilise le @post vous avez défini en haut de create.

64
deefour

Mettez à jour la méthode de création dans posts.controller.rb fichier avec le morceau de code ci-dessous. Ça a marché pour moi.

def create
  @post = Post.new(params[:post].permit(:title, :text))
  @post.save
  redirect_to @post
end
1
Sunny

Dans votre posts_controller, ajoutez ceci:

def new
  @post = Post.new
end 
0
Gourav Thakur