用于Rails 4中无效注释的button_to帮助器抛出“无路由匹配”

时间:2015-03-02 21:40:21

标签: ruby-on-rails ruby-on-rails-4

在此系统中,您可以发布问题并对其进行评论,并使用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

评论模型只有简单的presencelength验证。我知道这很好。问题似乎出现在button_to助手中,但对于我的生活,我无法弄清楚出了什么问题。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

原来这是路由错误; :id散列中未定义button_to,因此Rails无法正确路由它。奇怪的是,它仅在评论发布后才显示。