我有3个模型共享这种类似的形式来提交投票。这个表单包含在每个模型中显示页面,所以我想把这些代码放到一个部分来清理所有内容。
问题/ show.html.erb
<div class="vote">
<div id="questions">
<h1><%= @question.votes_count %></h1>
</div>
<%= link_to "up", vote_question_path(@question, value: 1), remote: true, method: "post" %>
<%= link_to "down", vote_question_path(@question, value: -1),remote: true, method: "post" %>
</div>
我已尝试根据以下代码将此代码移动到部分代码中:
表决/ _form.html.erb
<div class="vote">
<div id="votes_count">
Votes: <%= object.votes_count %>
</div>
<%= link_to "up", vote_path(object, value: 1),remote: true, method: "post" %>
<%= link_to "down", vote_path(answer, value: -1), remote: true, method: "post" %>
</div>
我使用以下调用替换显示页面中的上一个代码以呈现部分:
<%= render partial: "votes/form", locals: {object: @question, vote_path: answer_question_path } %>
但是,通过尝试各种字符串方法以及send(path)方法将vote_question_path传递给partial,它总是出错with NoMethodError undefined method "vote_path"
。
我如何正确而干净地将这些路径传递到这个特定的部分?
如果有人需要更多代码,请大声喊。
答案 0 :(得分:5)
按照自己的方式做事,Rails尝试立即评估路径,从而失败。但是,根据您的Ruby版本,您可能会尝试直接传递方法对象,如:
<%= render partial: "votes/form", locals: {object: @question, vote_path: method(:answer_question_path) } %>
然后,在投票/ _form
<div class="vote">
<div id="votes_count">
Votes: <%= object.votes_count %>
</div>
<%= link_to "up", vote_path.call(object, value: 1), remote: true, method: "post" %>
<%= link_to "down", vote_path.call(object, value: -1), remote: true, method: "post" %>
</div>
请参阅:http://ruby-doc.org/core-1.9.3/Object.html#method-i-method
答案 1 :(得分:1)
你可以这样做:
<%= render partial: "votes/form", locals: {object: @question, up_vote_path: vote_question_path(@question, value: 1), down_vote_path: vote_question_path(@question, value: -1) } %>
<强>表决/ _form 强>
<div class="vote">
<div id="votes_count">
Votes: <%= object.votes_count %>
</div>
<%= link_to "up", up_vote_path,remote: true, method: "post" %>
<%= link_to "down", down_vote_path, remote: true, method: "post" %>
</div>
答案 2 :(得分:0)
我认为在您的情况下,您可以使用之前评论中概述的任一方法。但是,这两种方法之间存在细微差别。
我们假设某人有这个代码(这也是你的情况)
<强>问题/ show.html.erb 强>
<div class="vote">
<div id="questions">
<h1><%= @question.votes_count %></h1>
</div>
<%= link_to "up", vote_question_path(@question, value: 1), remote: true, method: "post" %>
<%= link_to "down", vote_question_path(@question, value: -1),remote: true, method: "post" %>
</div>
在这种情况下,以下部分将正常工作:
<%= render partial: "votes/form", locals: {object: @question, up_vote_path: vote_question_path(@question, value: 1), down_vote_path: vote_question_path(@question, value: -1) } %>
但是,如果我们假设有人拥有此代码(有人必须遍历集合):
<强>问题/ show.html.erb 强>
<% @users.each do | user | %>
<div class="vote">
<div id="questions">
<h1><%= @question.votes_count %></h1>
</div>
<%= link_to "up", vote_question_path(user, @question, value: 1), remote: true, method: "post" %>
<%= link_to "down", vote_question_path(user, @question, value: -1), remote: true, method: "post" %>
</div>
<% end %>
这种方法不起作用,因为无法在渲染位置获取这些集合项。在这种情况下,vote_path: method(:answer_question_path)
更好。