在此系统中,您可以发布问题并对其进行评论,并使用acts_as_votable gem,以便用户可以对评论进行上/下注。我想显示upvote / downvote的按钮,而不是链接,所以我在视图中执行了此操作:
<h2>Comments</h2>
<% @question.comments.order('cached_votes_up DESC').each do |comment| %>
<% unless comment.errors.any? %>
<p><strong>Commenter:</strong> <%= comment.user.username %></p>
<p><strong>Comment:</strong><%= comment.body %></p>
<%= button_to_if !comment.new_record?, 'Upvote', {
:action => 'upvote',
:controller => 'comments',
:question => {
:question_id => @question.id
},
:comment => comment.id
},
:class => 'btn btn-default' %>
<%= button_to_if !comment.new_record?, 'Downvote', {
:action => 'downvote',
:controller => 'comments',
:question => {
:question_id => @question.id
},
:comment => comment.id
},
:class => 'btn btn-default' %>
<% end %>
<% end %>
<h2>Add a comment</h2>
<% if @comment && @comment.errors.any? %>
<% @comment.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
<% end %>
<%= form_for([@question, @question.comments.build]) do |f| %>
<p>
<%= f.label :body %><br>
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
现在,当评论有效时,一切都很有效。但是,Rails在提交评论但是无效:
时会抛出错误No route matches {
:action=> "upvote",
:comment=> 3,
:controller=> "comments",
:question=> {
:question_id=> 2
},
:question_id=> "2-test-question"
}
这是因为该问题的评论还没有ID,因为它无效,因此没有保存到数据库中。然而,它仍然被计入视图中呈现的注释集合中。用<% unless comment.errors.any? %>
包裹按钮代码似乎没有做任何事情。
最初,我有button_to
帮助器来创建按钮,但由于它不起作用,我尝试使用button_to_if
帮助程序包装它,以便它可以在之前评估条件渲染按钮。不幸的是,我尝试过的所有内容都是真的帮助代码是:
module ApplicationHelper
# Render the button only if the condition evaluates to true
def button_to_if (condition, name = nil, options = nil, html_options = nil, &block)
if condition
button_to(name, options, html_options, &block)
end
end
end
评论控制器创建评论的相关方法:
class CommentsController < ApplicationController
before_action :authenticate_user!
def create
@question = Question.find(params[:question_id])
@comment = @question.comments.build(comment_params)
@comment.userid = current_user.id
if @comment.save
redirect_to @question
else
render 'questions/show'
end
end
private
def comment_params
params.require(:comment).permit(:author, :body)
end
end
评论模型只有简单的presence
和length
验证。我知道这很好。问题似乎出现在button_to
助手中,但对于我的生活,我无法弄清楚出了什么问题。任何建议都将不胜感激。
答案 0 :(得分:0)
原来这是路由错误; :id
散列中未定义button_to
,因此Rails无法正确路由它。奇怪的是,它仅在评论发布后才显示。