"未定义的方法`验证'"错误 - RoR Tut 5.11添加一些验证

时间:2014-03-22 08:55:20

标签: ruby-on-rails validation ruby-on-rails-4

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部分的错误,所以我转向社区寻求指导。谁知道我哪里错了?在此先感谢您的帮助。

4 个答案:

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

注意:这是一个补充,可能对像我这样的新手有用。