Ruby on rails编辑文章评论

mbjcgjjk  于 2023-05-06  发布在  Ruby
关注(0)|答案(1)|浏览(109)

目的是编辑一篇文章的评论。
但是,我只能弄清楚如何使用<%= render 'form', comment: @comment %>显示新的注解字段,或者如何使用edit.html.erb中的<%= render 'comment', comment: @comment %>显示已经存在的注解文本
还尝试将<%= form_with model: [@article, @article.comments.build] do |form| %>更改为<%= form_with model: @article.comment do |form| %>,但在Comments#edit中出现NoMethodError

views/comments/edit.html.erb

<h1>Edit comment</h1>
<%= render 'comment', comment: @comment %>

comments/_form.html.erb

<%= form_with model: [@article, @article.comments.build] do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_area :commenter %>
  </p>
  <p>
    <%= form.label :body %>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.label :status %>
    <%= form.select :status, ['public', 'private', 'archived'], selected: 'public' %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

comments/_comment.html.erb

<p>
    <strong>Commenter:</strong>
    <%= comment.commenter %>
  </p>
  <p>
    <strong>Comment:</strong>
    <%= comment.body %>
  </p>
<%= link_to "Edit comment", edit_article_comment_path(comment.article, comment) %>
<p>
  <%= link_to "Destroy comment", [comment.article, comment], data: {
    turbo_method: :delete,
    turbo_confirm: "Are you sure?"
  } %>
</p>

comments_controller.rb

class CommentsController < ApplicationController

  http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]

  def create
    @article = Article.find(params[:article_id])
    @comments = @article.comments.create(comment_params)
    redirect_to article_path(@article)
  end

  def destroy
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
    @comment.destroy
    redirect_to article_path(@article), status: :see_other
  end

  def edit
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
  end

  def update
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
    # redirect_to article_path(@comment)

    if @comment.update(comment_params)
      redirect_to @comment
    else
      render :edit, status: :unprocessable_entity
    end
  end

  private
  def comment_params
    params.require(:comment).permit(:commenter, :body)
  end
end
dwbf0jvd

dwbf0jvd1#

就像几乎所有的计算机一样,你的表单实际上正在做你告诉它做的事情:
<%= form_with model: [@article, @article.comments.build] do |form| %>

  1. build@articles.comments对象的新示例
    1.显示新的comment的属性的形式(由于它是全新的,所以目前大多数属性为nil)
    您现有的代码可能已经很适合 * 创建 * 新的 * 注解。
    如果你试图编辑一个现有的评论,我想这可以帮助你看到你是在要求表单做错误的事情。
    几点注意事项:
  • @article.comment是不是一个东西(在这种情况下),因为它是很清楚,一篇文章has_many评论.

(因此Rails说NoMethodError。它告诉你一个Article的示例没有一个叫做comment的方法。

  • @article.comments是与该@article相关的所有评论的集合

它将始终是一个集合(数组),即使只有一个或甚至没有。如果你想要第一条评论的正文,你必须说@articles.comments.first.body;如果你试图调用@articles.comments.body,你会得到另一个NoMethodError

  • @article.comments.build“builds”(或“instantiates into memory without saving”)一个***new***注解,默认情况下它的所有属性都是nil,这就是你现在在表单中看到的。

下面是一些示例化新评论的其他方法:

  • Comment.new〈-与Article没有关联
  • Comment.new(article_id: @article.id)〈-关联到@article
  • Comment.new(article: @article)〈-相同,因为Rails是智能的
  • @article.comments.new〈-关联到@article

您在控制器(@comment = @article.comments.find(params[:id]))中设置@comment,因此只需使用:

<%= form_with model: @comment do |form| %>
  <!--- all the same code you already have -->
<% end %>

但请等待,如果您只是更改comments/_form.html.erb中的form_with代码,则您的表单将适用于***编辑***,但不再适用于***创建***。

你没有在你的CommentsController中包含new操作,我假设这是因为“新评论”表单是通过你的ArticlesController操作之一显示的,可能是#show,这很常见。

那么,解决办法是什么?

由于您使用的是partial,因此您试图将_form.html.erb代码重用于多种用途,这是明智的,并且如果@comment变量可以更改以适应需要,则可以工作。
当您想要编辑现有的注解时,@comment必须设置为您实际想要编辑的现有注解。你很幸运,事实就是这样。
当您想要创建新注解时,@comment必须是已经与正确的@article关联的新注解。你可以这样做:@comment = @article.comments.new(或.build,如果您真的更喜欢)
在哪里添加这个新变量?在任何ArticlesController操作中,您都可以显示“新评论”表单(例如:您引用comments/new.html.erb文件的位置):

class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id])
    @comment = @article.comments.new
  end
end

现在当comments/_form.html.erb被渲染时:

  • /articles/:article_id/comments/:id/edit中,@comment将被设置为现有的注解记录
  • /articles/:id中,@comment将被设置为与@article关联的新注解记录

希望这个漫无边际的回答有帮助!

相关问题