你好我是ruby on rails的新手,到目前为止我已经完成了this tutorial。我现在正在尝试添加功能,以便我可以通过电子邮件向某人发送评论,因为它已发布,我已经开始工作。
我似乎无法开始工作的唯一部分是让我的视图识别我在评论类中设置的变量(在bd中)。
在下面显示的代码中我试图检查是否输入了电子邮件地址。如果是,那么它试图发送;如果没有,它会照常发布评论。我已经设置了一个布尔值来确定是否输入了电子邮件。但是在_comment.html.erb中我无法访问它。这是为什么?
comment.html.erb
<p>
<strong>Commenter:</strong>
<%= comment.commenter %>
</p>
<p>
<strong>Comment:</strong>
<%= comment.body %>
</p>
<p>
<%= comment.attempted.to_str %> <==== this line crashes as attempted is a nil class
</p>
<% if(comment.attempted == true) %>
<p>
your email was sent
</p>
<% end %>
<p>
<%= link_to 'Destroy Comment', [comment.article, comment],
method: :delete,
data: { confirm: 'Are you sure?' } %>
</p>
_form.html.erb(这是构建初始评论的内容)
<p>
<strong>Commenter:</strong>
<%= comment.commenter %>
</p>
<p>
<strong>Comment:</strong>
<%= comment.body %>
</p>
<p>
<%= comment.body.to_str %>
</p>
<% if(comment.attempted == true) %>
<p>
your email was sent
</p>
<% end %>
<p>
<%= link_to 'Destroy Comment', [comment.article, comment],
method: :delete,
data: { confirm: 'Are you sure?' } %>
</p>
comments_controller.rb
class CommentsController < ApplicationController
http_basic_authenticate_with name: "dhh", password: "secret", only: :destroy
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.create(comment_params)
@comment.attempted = false
if(!@comment.email.empty?)
@comment.attempted = true
if(@comment.email.include? '@')
UserMailer.comment_email(@comment.email,@comment.body).deliver_now
end
end
redirect_to article_path(@article)
end
对于_comment.html.erb中的注释我可以访问comment.boby和comment.commenter就好了,但尝试的是nil。为什么会这样,我该如何解决?
答案 0 :(得分:0)
这里最明显的问题是你没有保存你对评论所做的更改。
当需要迭代记录所具有的注释时,该模型将从数据库重新生成,它是一个单独的实例。
最可能的解决方法是:
# Prepare but do not save a new model
@comment = @article.comments.build(comment_params)
@comment.attempted = false
# ... Stuff that may alter @comment.attempted
# Save the new instance.
@comment.save!
答案 1 :(得分:0)
看起来你的方法中有一个循环:
def创建 @article = Article.find(params [:article_id]) @comment = @ article.comments.create(comment_params)
这将再次调用create函数。 即你的代码永远不会到达下一行的作业:
@ comment.attempted = false
这就是为什么在视图中将comment.attempted解析为'nil',因为它永远不会在控制器中设置。
我会像这样重写它:
def create
@article = Article.find(params[:article_id])
@comment.attempted = false
if(!@comment.email.empty?)
@comment.attempted = true
if(@comment.email.include? '@')
UserMailer.comment_email(@comment.email,@comment.body).deliver_now
end
end
# This line adds the comment instance to the article's comments collection.
@article.comments << @comment
redirect_to article_path(@article)
end