ruby on rails - “Métodos ''errores'' indefinidos para nil: NilClass” al llamar al método de errores
ruby-on-rails erb (2)
Actualice el método de creación en el archivo posts.controller.rb
con el siguiente fragmento de código. Funciono para mi
def create
@post = Post.new(params[:post].permit(:title, :text))
@post.save
redirect_to @post
end
Actualmente me estoy enseñando algo de RoR y haciendo el tutorial, pero agregando un diseño y cosas más bonitas con bootstrap y me estoy topando con un problema que no puedo resolver.
Estoy tratando de hacer la parte de validación ( http://guides.rubyonrails.org/getting_started.html#adding-some-validation ), pero cuando uso:
<% @post.errors.any? %>
Recibo este mensaje:
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">
Nada funciona e incluso copié y pegué las partes del tutorial.
Aquí está el código para 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>
Y mi 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é me estoy perdiendo? ¡Gracias por adelantado!
También necesitas definir @post
en tu new
acción.
def new
@post = Post.new
end
Recibirá el error NilClass
porque @post
no tiene ningún valor (es nil
) cuando carga el formulario por primera vez en la new
acción.
Cuando haces el render :new
en tu acción de create
, no hay problema porque usa el @post
que definiste en la parte superior de create
.