我正在学习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
由于评论按预期工作,我想知道为什么我的帖子页面工作方式不同。它似乎不是一个错字。任何帮助将不胜感激。
答案 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 %>
这应该将所需数据传递给您的控制器,以便您正确验证它