提问人:eulu 提问时间:5/16/2023 最后编辑:eulu 更新时间:8/2/2023 访问量:108
Rails 7 “Getting Started with Rails” 验证注释的首选方法是什么?
Rails 7 "Getting Started with Rails" what is the prefered way to validate comments?
问:
我是 rails 的新手。感谢任何帮助。
我正在尝试扩展博客的功能,在官方的 Rails 7 指南中进行了描述,并进行了注释验证。
这是我的项目代码的 github 存储库链接。
在提交无效表单后,向注释添加验证并在前端显示错误消息的正确方法是什么?
设置
ubuntu - 22.04
rvm - 1.29.12
ruby - 3.1.4p223
rails - 7.0.4.3
目前,如果我在注释模型上添加这些验证,则验证不起作用。当我提交一个空的评论表单时,它只是将我重定向到帖子页面。
/应用/模型/评论.rb
class Comment < ApplicationRecord
belongs_to :post
validates :author, presence: true
validates :body, presence: true
end
还尝试处理 中的注释保存。但它用空的 和 字段保存注释。comments_controller
:author
:body
/应用/控制器/comments_controller.rb
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(comment_params)
if @comment.save
redirect_to @post
else
render @post, status: :unprocessable_entity
end
end
/app/views/comments/_form.html.erb
<%= form_with model: [@post, @post.comments.build] do |form| %>
<div class="mb-3">
<%= form.label :author, class: 'form-label' %><br>
<%= form.text_field :author, class: 'form-control', placeholder: 'John Doe' %>
</div>
<div class="mb-3">
<%= form.label :body, class: 'form-label' %><br>
<%= form.text_area :body, class: 'form-control', rows: 3 %>
</div>
<div class="mb-3">
<%= form.submit 'Add comment', class: 'btn btn-outline-primary' %>
</div>
<% end %>
这是我想实现的一些可视化(我只是通过开发工具添加了一些html)。第一张截图 - 在提交评论表单之前发布页面,只是干净的页面。第二张截图(我想拍什么) - 我提交带有空作者和正文字段的评论表单后的同一页面。
答:
一种选择是在保存之前验证参数,如下所示:
创建一个方法来检查所有参数是否都不为空。
然后,在操作之前调用此方法的 befeore_action 以创建“注释”。
在 create 中,验证该方法是否返回 true 或 false。
如果为 true,它会重定向到帖子页面,注意到用户评论尚未保存,否则创建方法将遵循其流程。
class CommentsController < ApplicationController
before_action :comment_params_empty, only: [:create]
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(comment_params)
if comment_params_empty
flash[:notice] = "Comment not saved!"
redirect_to @post
else
if @comment.save
redirect_to @post
else
render @post, status: :unprocessable_entity
end
end
end
private
def comment_params_empty
comment_params.values.all?(&:blank?)
end
end
在这种情况下,我只考虑创建,但您需要考虑 CRUD 系统的其他步骤。
评论
对不起,我完全错过了.从字面上看,您是在告诉它在失败时呈现帖子页面:)将其更改为render @post
render :new, status...
评论
/app/views/comments/new.html.erb
..../_form.html.erb
@post.comments
@comment
@comment
save
@comment
create
if
@post
PostController->show
@comment
PostController->show
评论
@comment
@post.comments
@comment
@post.comments