Частичный AJAX в цикле

Я пытаюсь отобразить частичное с помощью ajax при отправке формы. Вот мой код:

index.html.erb

<% @inbox.each do |conversation| %>
  <div class="message">
     <div id="messages">
        <%= render conversation.messages %>
     </div>

     <div class="inner-message">
       <%= form_tag({controller: "conversations", action: "reply", id: conversation.id}, {remote: true, method: :post}) do %>
         <%= hidden_field_tag :recipient_id, current_user.id %>
         <%= hidden_field_tag :subject, "#{current_user.name}" %>

         <div class="form-group">
           <%= text_area_tag :body, nil, class: "form-control", placeholder: "Odgovori" %>
         </div>

         <div class="form-group">
           <%= submit_tag 'Pošlji', class: "btn btn-primary" %>
         </div>
       <% end %>
     </div>
  </div>
<% end %>

index.js.erb

$("#messages").html("<%= escape_javascript(render conversation.messages) %>")

разговоры_controller.rb

def reply
  conversation = current_user.mailbox.conversations.find(params[:id])
  current_user.reply_to_conversation(conversation, params[:body])

  respond_to do |format|
     format.html { redirect_to messages_path }
     format.js { redirect_to messages_path }
  end
end

когда я отправляю форму, я получаю ошибку неопределенной локальной переменной:

ActionView::Template::Error (неопределенная локальная переменная или метод `диалог' для #‹#:0x007fd287172fa8>)

Как передать локальную переменную из цикла в представление .js.erb?

Спасибо!


person figdig    schedule 20.12.2014    source источник
comment
вы имеете в виду «разговор» от контроллера к файлу js.erb или о каком цикле вы говорите? «Как мне передать локальную переменную из цикла в представление .js.erb?»   -  person Aditya Shedge    schedule 21.12.2014
comment
ваш метод контроллера будет отображать answer.html.erb или answer.js.erb, а не index.*.erb. Также для того, чтобы переменные были видны в представлениях, вам нужно использовать @беседу, а не беседу. Имеет смысл?   -  person Stan Wiechers    schedule 21.12.2014


Ответы (1)


Я обычно не делаю много рендеринга js в приложениях, поэтому я немного заржавел в специфике. Однако есть пара проблем с вашим кодом.

  1. Во-первых, выполнив перенаправление, вы указываете браузеру загрузить новый URL-адрес. Любые переменные, такие как «разговор», которые вы бы установили, будут забыты.

  2. Как упомянул Стэн Вичерс, вам нужно использовать переменную экземпляра (например, @conversation), если вы хотите сохранить разговор для представления. К сожалению, в данном случае это вам не поможет из-за перенаправления, которое стирает все переменные, не сохраненные в сеансе, файлах cookie или флэш-хэше.

  3. Я думаю, что вы хотите сделать свой частичный вместо перенаправления. Обычно, когда вы используете ajax, вы не хотите перезагружать страницу на стороне сервера. В Rails вы обычно визуализируете json или, в вашем случае, частичное js.

Пытаться

format.js{render partial:[PARTIAL NAME], locals:{conversation: conversation} }

Это отобразит частичное без перенаправления и передаст вашу локальную переменную. Если вы измените «беседу» на @conversation, вы можете не указывать locals:{беседа: беседа}, но ваша часть должна ссылаться на

@беседа

нет

беседа

надеюсь, это поможет

person hraynaud    schedule 22.12.2014