将路径传递给rails partial时的NoMethodError

dod*_*747 0 ruby ruby-on-rails partial-views path

我有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>
Run Code Online (Sandbox Code Playgroud)

我已经尝试将此代码移动到部分代码,如下面的代码:

表决/ _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>
Run Code Online (Sandbox Code Playgroud)

我使用以下调用替换显示页面中的先前代码以呈现部分:

<%= render partial: "votes/form", locals: {object: @question, vote_path: answer_question_path } %>
Run Code Online (Sandbox Code Playgroud)

但是,通过尝试各种字符串方法以及send(path)方法将vote_question_path传递给partial它总是出错with NoMethodError undefined method "vote_path".

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

如果有人需要更多的代码只是喊.

chr*_*ais 5

按照自己的方式做事,Rails尝试立即评估路径,从而失败.但是,根据您的Ruby版本,您可能会尝试直接传递方法对象,如下所示:

<%= render partial: "votes/form", locals: {object: @question, vote_path: method(:answer_question_path) } %>
Run Code Online (Sandbox Code Playgroud)

然后,在投票/ _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>
Run Code Online (Sandbox Code Playgroud)

请参阅:http://ruby-doc.org/core-1.9.3/Object.html#method-i-method