活动记录验证问题

时间:2014-08-24 06:01:41

标签: ruby-on-rails

我正在学习Ruby on Rails的Coursera课程,我们测试了两个示例页面的验证,一个帖子页面和一个评论页面。当我在浏览器中打开示例时,评论页面上的验证工作正常,不允许我在没有post_id或正文的情况下提交评论。问题是当我期望帖子页面得到相同结果时,我可以在没有收到错误消息的情况下提交任何内容,提交内容可能没有标题或正文,但仍然可以接受。

以下是有问题的两段代码:

评论

class Comment < ActiveRecord::Base
 belongs_to :post
 validates_presence_of :post_id
 validates_presence_of :body
end

帖子

class Post < ActiveRecord::Base
 has_many :comments, dependent: :destroy
 validates_presence_of :title
 validates_presence_of :body
end

我正在练习的讲座就在这里,代码从9分钟开始。 https://class.coursera.org/webapplications-002/lecture/53

由于评论按预期工作,我想知道为什么我的帖子页面工作方式不同。它似乎不是一个错字。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以先打开一个新终端并输入以下内容来排除您的型号代码:

rails console

您现在将处于独立的ruby模式,同时也会加载您的应用。您现在可以输入:

@post = Post.new(:title => 'My post without a body')

然后尝试保存到数据库,键入:

@post.save

如果它正在工作,你将得到一个真实的回报,如果它不是,那么它将是假的,如果它是假的类型:

@post.errors.full_messages

这应该可以帮助您解答为什么它不起作用。如果保存确实返回true,那么您知道您一切都很好,我们需要寻找其他地方。

答案 1 :(得分:0)

您可能希望使用新的validates directive

#app/models/post.rb
Class Post < ActiveRecord::Base
   validates :title, :body, presence: true
end

关于为什么这不能解决您在表单中包含的“错误”,存在许多潜在问题。

-

<强>控制器

最有可能的是,您不会填写表单的@active_record_object

这将是一个问题,因为它不会向您提供错误消息(如anti-fun所述),但也可能会阻止您发送所需的正确数据。

这就是我要做的事情:

#app/controllers/posts_controller.rb
Class PostsController < ApplicationController
   def new
      @post = Post.new #-> sets the ActiveRecord object for your form
   end

   def create
      @post = Post.new post_params
      @post.save
   end

   private

   def post_params
      params.require(:post).permit(:title, :body)
   end
end

#app/views/posts/new.html.erb
<%= form_for @post do |f| %>
   <% if @post.errors.any? %>
      <% @post.errors.full_messages.each do |error| %>
          <%= error %>
      <% end %>
   <% end %>

   <%= f.text_field :title %>
   <%= f.text_field :body %>
   <%= f.submit %>
<% end %>

这应该将所需数据传递给您的控制器,以便您正确验证它