1

我正在尝试在提交表单时使用 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) %>")

对话控制器.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 视图?

谢谢!

4

1 回答 1

0

我通常不会在应用程序中做太多的 js 渲染,所以我对细节有点生疏。但是,您的代码存在一些问题。

  1. 首先通过发出重定向指示浏览器加载新的 url 。您将设置的任何变量(例如“对话”)都将被遗忘。

  2. 正如 Stan Wiechers 所暗示的,如果您想保留视图的对话,则需要使用实例变量(例如 @conversation)。不幸的是,在这种情况下这对您没有帮助,因为重定向会清除所有未存储在会话、cookie 或闪存哈希中的变量。

  3. 我认为你想要做的是呈现你的部分而不是重定向。通常,当您使用 ajax 时,您不想在服务器端重新加载页面。在 Rails 中,您通常会渲染 json 或在您的情况下渲染 js 部分。

尝试

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

这将在不重定向的情况下呈现部分,并将传递您的局部变量。如果您将 'conversation' 更改为 @conversation,那么您可以省略locals:{conversation: conversation}但您的部分内容应该参考

@对话

不是

对话

希望有帮助

于 2014-12-22T03:00:14.797 回答