目的是编辑一篇文章的评论。
但是,我只能弄清楚如何使用<%= 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
1条答案
按热度按时间dwbf0jvd1#
就像几乎所有的计算机一样,你的表单实际上正在做你告诉它做的事情:
<%= form_with model: [@article, @article.comments.build] do |form| %>
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
,因此只需使用:但请等待,如果您只是更改
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
文件的位置):现在当
comments/_form.html.erb
被渲染时:/articles/:article_id/comments/:id/edit
中,@comment
将被设置为现有的注解记录/articles/:id
中,@comment
将被设置为与@article
关联的新注解记录希望这个漫无边际的回答有帮助!