Рендеринг в другом порядке на странице нарушает маршрутизацию - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть вызовы, содержащие Puns, и я могу голосовать за puns. На странице Challenge Show все каламбуры отображаются и показывают количество их голосов. Это в настоящее время на странице просмотра:

  <%= render @challenge.puns.reverse %>
  <br>
  <div id="form">
    <%= render "puns/form" %>
  </div>

Я хочу, чтобы форма каламбуров отображалась над уже представленными элементами (каламбурами). Но если поменять их местами, вот так:

  <div id="form">
    <%= render "puns/form" %>
  </div>
  <%= render @challenge.puns.reverse %>

Я получаю сообщение об ошибке контроллера, и файл pun.id внезапно недоступен, а ссылка для голосования обрывается.

No route matches {:action=>"upvote", :challenge_id=>"9", :controller=>"puns", :id=>nil}, missing required keys: [:id]

Вот часть каламбур / форма, которая вызывает проблему

<% if signed_in? %>
  <% if current_user.voted_for? pun %>
    <%= pun.votes_for.size %>
    <span class="pun_text"><%= link_to pun.pun_text, challenge_pun_path(@challenge, pun.id) %></span>
  <% else %>
    <%= link_to like_challenge_pun_path(@challenge, pun.id), method: :put do %>
      <span class="heart_like">&#10084;</span>&nbsp;<%= pun.votes_for.size %>&nbsp;
    <% end %>
      <span class="pun_text"><%= link_to pun.pun_text, challenge_pun_path(@challenge, pun.id) %></span>
  <% end %>
<% end %>

Это like_challenge_pun_path, который выдает ошибку, но я не могу понять, почему. Я снова объявляю @challenge, так что он сможет получить идентификатор.

Вот форма для игры в каламбур:

<%= form_for([@challenge, @challenge.puns.build]) do |f| %>
  <span class=".emoji-picker-container">
    <%= f.text_area :pun_text, placeholder: "Add pun", data: { emojiable: true } %>
  </span>
  <%= f.submit %>
<% end %>

Кроме того, вот моя настройка маршрутов

  resources :challenges do
    resources :puns do
      member do
        put "like", to: "puns#upvote"
        put "dislike", to: "puns#downvote"
      end
    end
  end

и соответствующее действие для upvote

def upvote
  @pun = @challenge.puns.find(params[:id])
  @pun.upvote_by current_user
  redirect_to @challenge
end

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 29 апреля 2018

Я думаю, что код для коллекции каламбуров. Я предполагаю, что проблема в том, что в форме у вас есть что-то вроде:

@challenge.puns.build

Таким образом, в @challenge.puns коллекция отображается как непостоянная запись (без идентификатора), поэтому путь для этой модели не может быть создан.

В качестве быстрого решения я предлагаю:

<%= render @challenge.puns.reverse.select(&:persisted?) %>

UPDATE: Как я и предполагал, у вас есть

<%= form_for([@challenge, @challenge.puns.build]) do |f| %>

Вы также можете попробовать:

<%= form_for([@challenge, Pun.new]) do |f| %>

Или решить это в контроллере. Но для этого нужно увидеть код контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...