【发布时间】:2025-12-27 16:40:16
【问题描述】:
我正在尝试构建一个简单的博客,其中一篇文章有许多 cmets,并且这些 cmets 显示在 posts#show 页面上。
我有两个我无法弄清楚的错误:
- 对我的 cmets 的验证不起作用。注释的名称和内容应该存在。每当我尝试提交“空”评论时,我都会收到一条错误消息:“NoMethodError in CommentsController#create: undefined method `empty?'对于零:NilClass”。我怀疑在我的 cmets_controller.rb 中我必须在我的创建操作中呈现不同的页面(代码见下文)?
- 每当我创建新帖子时,总会有一个属于空评论的空“删除”链接(没有人创建。它是自动创建的?)。这个“删除”链接链接到http://localhost:3000/posts/[post_id]/comments(请注意,在“/cmets”之后没有像“/comment/3/”这样的comment_id)
routes.rb:
resources :posts do
resources :comments
end
app/models/post.rb
class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
end
app/models/comment.rb
class Comment < ActiveRecord::Base
validates :name, presence: true
validates :content, presence: true
belongs_to :post
end
app/controllers/cmets_controller.rb
class CommentsController < ApplicationController
before_action :set_post
def create
@comment = @post.comments.build(comment_params)
if @comment.save
flash[:success] = "Comment saved!"
redirect_to post_path(@post)
else
flash[:alert] = "Something went wrong!"
render root_path # I suspect here is an error?
end
end
def destroy
@comment = @post.comments.find(params[:id])
@comment.destroy
flash[:success] = "Comment deleted"
redirect_to post_path(@post)
end
private
def comment_params
params.require(:comment).permit(:name, :email, :content)
end
def set_post
@post = Post.find(params[:post_id])
end
end
app/views/posts/show.html.erb
这是我创建新帖子时出现“删除”链接的问题。这个“删除”链接属于一个空的并且奇怪地自动创建的评论?
<% unless @post.comments.empty? %> # I suspect here is an error?
<% @post.comments.each do |comment| %>
<p><%= comment.name %></p>
<p><%= comment.content %></p>
<p><%= link_to "Delete", [comment.post, comment],
method: :delete,
data: { confirm: "Are you sure?" } %></p>
<% end %>
<% end %>
app/views/posts/new.html.erb
<%= form_for(@post) do |f| %>
<% if @post.errors.any? %>
<div id="error_explanation">
<h2><%= @post.errors.count %> Fehler:</h2>
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="image-box">
<p><%= f.file_field :image%></p>
</div>
<div class="title-box">
<p><%= f.label :title, "Titel" %></p>
<p><%= f.text_field :title, class: "title-field"%></p>
</div>
<div class="content-box">
<p><%= f.label :content, "Inhalt" %></p>
<p><%= f.text_area :content, class: "content-field"%></p>
</div>
<p><%= f.submit %></p>
<% end %>
【问题讨论】:
-
对于您的第一个问题,调查为什么
@post.comments为零会很有趣。我会在这里使用binding.pry进行调试,看看@post 的价值是什么。对于您的第二个问题,我也会尝试查看comment的值是多少 -
第二个问题:当我创建一个新帖子并在rails控制台中输入>Post.last.cmets.nil? => 错误。所以自动有一个“幽灵”评论还是正常的?这对我来说很奇怪。然后我输入 >Post.last.cmets.last.nil? => 真的。所以我的“幽灵”评论没有价值:)?例如,我无法键入
-
分享新表单的代码
-
试试
Post.last.comments看看里面有什么,它会给你更好的洞察力,你可以使用blank?而不是nil?,因为cmets会返回[]而一个空数组会不考虑nil。 -
Post.last.comments给我 'SELECT "cmets".* FROM "cmets" WHERE "cmets"."post_id" = ? [["post_id", 46]] => #<:associations::collectionproxy>'
标签: ruby-on-rails ruby validation ruby-on-rails-4