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!
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
.
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
Dans votre posts_controller, ajoutez ceci:
def new
@post = Post.new
end