我目前正在教自己一些RoR和教程,但添加一些更好的布局和引导程序的东西,我遇到了一个我无法弄清楚的问题。
我正在尝试执行验证部分(http://guides.rubyonrails.org/getting_started.html#adding-some-validation),但是当我使用:
时<% @post.errors.any? %>
我收到此消息:
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">
没有任何作用,我甚至复制并粘贴了教程中的部分。
以下是视图的代码:
<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>
我的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
我错过了什么?提前谢谢!
答案 0 :(得分:59)
您还需要在@post
操作中定义new
。
def new
@post = Post.new
end
您收到NilClass
错误,因为@post
首次在{{1}上加载表单时没有值(它是nil
)行动。
当您在new
操作中执行render :new
时,没有任何问题,因为它使用您在create
顶部定义的@post
。
答案 1 :(得分:1)
使用下面的代码更新posts.controller.rb
文件中的create方法。它对我有用。
def create
@post = Post.new(params[:post].permit(:title, :text))
@post.save
redirect_to @post
end
答案 2 :(得分:0)
在您的posts_controller中,添加以下内容:
def new
@post = Post.new
end
答案 3 :(得分:0)
如果您已经进行了更改以进行编辑/创建等操作,并且仍然为您提供ActionView :: Template :: Error(nil:NilClass的未定义方法“ errors”):
尝试重新启动rails server
即使纠正了article_controller.rb中的文件,我仍然收到错误消息
,仍然出现错误。重新启动Rails服务器后,此问题已修复。