Ruby on Rails noob在这里参加了RoR.org上的入门教程。我是在" 5.11添加一些验证",并在尝试刷新/ posts / new页面时抛出错误:
错误消息:
NoMethodError in PostsController#new
undefined method ` validates' for #<Class:0x0000000414fab0>
Extracted source (around line #2):
1 class Post < ActiveRecord::Base
2 validates :title, presence: true,
3 length: { minimum: 5 }
4 end
my post.rb:
class Post < ActiveRecord::Base
validates :title, presence: true,
length: { minimum: 5 }
end
my posts_controller.rb:
class PostsController < ApplicationController
def index
@posts = Post.all
end
def new
@post = Post.new
end
def create
@post = Post.new(params[:post].permit(:title, :text))
if @post.save
redirect_to @post
else
render 'new'
end
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :text)
end
end
旁注 - FWIW,在尝试诊断时,我从@post = Post.new
删除了posts_controller.rb
,并在刷新时收到此错误:
undefined method `errors' for nil:NilClass
Extracted source (around line #3):
<h1>New Post</h1>
<%= form_for :post, url: posts_path do |f| %>
<% if @post.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
无法找到new.html.erb部分的错误,所以我转向社区寻求指导。谁知道我哪里错了?在此先感谢您的帮助。
答案 0 :(得分:24)
在将我的头撞在桌子上30分钟之后,重新创建应用程序三次,因为我认为我可能会犯一些错字,这就是问题所在:
NoMethodError(对于#,未定义的方法`验证')
请注意第一个引用和之间存在较大差距? - &GT;的`验证强>
是的,就是这样。当您从网站复制并粘贴代码时,无论@#$%^&amp; *字符附带什么。我也从同一个教程中复制了很多其他代码,这一切都很有效。因此修复方法是在使用空格或标签“验证”之前替换不可见字符。
“Rails入门”的好方法。 Just Great™。 Rails,一定很棒。
答案 1 :(得分:1)
您应该使用validate
(不使用s
)代替validates
。见this:
你遇到的问题可能与我的神秘有关 并错误地部署了Rails 3教程。
validates
方法 特定于Rails 3.尝试刷新浏览器以查看正确的 Rails 2.3版本,我认为事情会更好。感到抱歉 混乱。
答案 2 :(得分:1)
与Uri Agassi的回答相矛盾,Rails docs提到这是在Rails 4中验证的正确方法(你说你正在使用):
class Post < ActiveRecord::Base
validates :title, length: { minimum: 5 }
end
对我来说,这会建议删除presence: true
,但我认为您发布的代码看起来有正确的sytanx
<强>控制器强>
另一个原因可能是你的控制器:
@post = Post.new(params[:post].permit(:title, :text))
如果您正在使用Rails 4,则应使用Strong Params编码约定来创建记录:
@post = Post.new(post_params)
如果您进行了这两项更改,请回来告诉我们它是如何运作的
答案 3 :(得分:0)
我刚遇到此问题,按照建议删除了空格,并将方法从“验证”更改为“验证”,但错误仍然存在。我发现的解决方案是使类从应用程序记录继承,例如:'< ApplicationRecord'
:
class User< ApplicationRecord
validates :email, presence: true, uniqueness: true
validates :name, presence: true#, uniqueness: true
end
注意:这是一个补充,可能对像我这样的新手有用。