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_quest_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) } %>

次に、vote/_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 に答える
0

あなたの場合、前のコメントで概説したいずれかのアプローチを使用できると思います。ただし、2 つのアプローチにはわずかな違いがあります。

誰かがこのコードを持っていると仮定しましょう (これはあなたのケースでもあります)

質問/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 に答える