Rails 7 “Getting Started with Rails” 验证注释的首选方法是什么?

Rails 7 "Getting Started with Rails" what is the prefered way to validate comments?

提问人:eulu 提问时间:5/16/2023 最后编辑:eulu 更新时间:8/2/2023 访问量:108

问:

我是 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)。第一张截图 - 在提交评论表单之前发布页面,只是干净的页面。第二张截图(我想拍什么) - 我提交带有空作者和正文字段的评论表单后的同一页面。

第一张截图

第二张截图(这是我想要的评论表单的样子)

Ruby 验证 注释 Ruby-on-rails-7

评论

0赞 smathy 5/18/2023
您的注释模型没有验证,您确定已保存文件吗?
0赞 eulu 5/18/2023
对不起,忘了提,我还没有推送验证码。但我确信我在本地有我的问题中的代码。
0赞 eulu 8/1/2023
问题的最新代码在存储库中,问题中的链接指向专用分支。
0赞 smathy 8/1/2023
添加表单模板。
0赞 eulu 8/1/2023
做。我试图在无效表单提交后查找内部某处的错误或显示在页面上,但是在表单提交和重定向后页面上没有对象,并且没有将新的(无效)注释添加到.@comment@post.comments@comment@post.comments

答:

0赞 bragarr 5/23/2023 #1

一种选择是在保存之前验证参数,如下所示:

创建一个方法来检查所有参数是否都不为空。

然后,在操作之前调用此方法的 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 系统的其他步骤。

评论

0赞 eulu 8/1/2023
谢谢你的建议。这种方式不允许我在每个有错误的表单字段上附加错误消息。而且我不能拥有模型验证带来的优势。
0赞 smathy 8/1/2023 #2

对不起,我完全错过了.从字面上看,您是在告诉它在失败时呈现帖子页面:)将其更改为render @postrender :new, status...

评论

0赞 eulu 8/2/2023
感谢您的帮助)正如我所看到的那样,这促使我创建一个模板,该模板将呈现,因此在提交评论表单后,它会将我重定向到具有表单的页面,但这不是我真正需要的。评论表单(以及所有集合)现在呈现在帖子页面上。因此,最好保持在同一页面上(与帖子内容和相关评论),但只使用错误消息更新新的评论表单。我将尝试添加一些屏幕截图,以提供我想要实现的目标的一些可视化。/app/views/comments/new.html.erb..../_form.html.erb@post.comments
0赞 smathy 8/2/2023
然后呈现该页面
0赞 eulu 8/2/2023
当我渲染该页面时,我没有之前提交的对象(错误为空 Author 或 Body为空)@comment
0赞 smathy 8/3/2023
你显然确实有这个能力,因为你在其他方面试图做到这一点@commentsave
0赞 eulu 8/3/2023
我确实在 comments_controller.rb 操作中,但在我重定向到的虚假早午餐中,我没有它。我重定向到帖子,因为我的布局不是在单独的页面上,而是直接在帖子页面(操作)上。因此,我需要将无效传递给或重新渲染带有验证错误的注释表单“脏”。@commentcreateif@postPostController->show@commentPostController->show