0

我有 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 传递到部分中,它总是会出错with NoMethodError undefined method "vote_path"

我怎样才能正确而干净地将这些路径传递到这个特定的部分?

如果有人需要更多代码,请大声喊叫。

4

3 回答 3

6

按照你的方式做事,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

于 2013-05-27T17:54:14.970 回答
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>
于 2013-05-27T17:37:46.667 回答
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)更好。

于 2016-01-28T18:25:52.167 回答