【问题标题】:"undefined method ` validates'" error - RoR Tut 5.11 Adding Some Validation“未定义的方法`验证'”错误 - RoR Tut 5.11 添加一些验证
【发布时间】:2014-04-29 19:24:13
【问题描述】:

Ruby on Rails 菜鸟在这里学习 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

我的帖子.rb:

class Post < ActiveRecord::Base
  validates :title, presence: true,
                    length: { minimum: 5 }
end

我的 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,在尝试诊断此问题时,我从 posts_controller.rb 中删除了 @post = Post.new,刷新时出现此错误:

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 部分有任何问题,因此我正在向社区寻求指导。有人知道我哪里出错了吗?提前感谢您的帮助。

【问题讨论】:

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


【解决方案1】:

您应该使用validate(不带s)而不是validates。见this

您遇到的问题可能与我的神秘 和错误部署 Rails 3 教程。 validates 方法 特定于 Rails 3。尝试刷新浏览器以查看正确的 Rails 2.3 版本,我认为事情会更好。感到抱歉 混乱。

【讨论】:

  • 感谢您的回复。刚回到家,从验证中删除了“s”,刷新了/posts/new,并抛出了同样的错误(虽然是差异类号),这让我相信 u/Rich-Peck 说你的指令是正确的正确。
【解决方案2】:

为了与 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)

如果您进行了这 2 项更改,请回来告诉我们它是如何工作的

【讨论】:

  • 感谢您的回复。当我将@post = Post.new(params[:post].permit(:title, :text)) 更改为@post = Post.new(post_params) 并刷新时,Rails 服务器在第 9 行引用 index.html.erb 时抛出了一个不同的错误:NoMethodError in Welcome#index undefined method `each' for nil:NilClass Extracted来源(第 9 行附近):6 7 8 9 10 11 12 Text
  • 意思是我删除了presence: true,刷新并得到了undefined method validates 错误。
【解决方案3】:

在将我的头撞在桌子上 30 分钟后,并重新创建应用程序 3 次,因为我认为我可能打错了,这就是问题所在:

NoMethodError(未定义的方法 `  validates' for #)

注意到 first quotevalidates 之间的巨大差距吗? --> `  验证'

是的,就是这样。当您从站点复制并粘贴代码时,无论 @#$%^&* 字符附带什么。我还从同一个教程中复制了很多其他代码,而且一切都很好。

因此解决方法是将“验证”之前的不可见字符替换为空格或制表符。

“Rails 入门”的好方法。刚刚好™。 Rails,一定很棒™。

【讨论】:

  • 就是这样。谢谢好心的先生。
  • 反引号为我节省了一些痛苦。谢谢!
  • 让这成为我们所有懒惰复制/粘贴的人的教训。我也犯了同样的罪。继续我的朋友们!
【解决方案4】:

我刚遇到这个问题,按照建议删除了空格并将方法从“验证”更改为“验证”,但错误仍然存​​在。我找到的解决方案是让类继承自应用程序记录:'&lt; ApplicationRecord':

class User< ApplicationRecord
    validates :email, presence: true, uniqueness: true
    validates :name, presence: true#, uniqueness: true
end

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

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签