【问题标题】:AJAX partial in loopAJAX 部分循环
【发布时间】:2015-02-19 11:54:38
【问题描述】:

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

conversations_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(未定义的局部变量或方法 # 的“对话”)

如何将局部变量从循环传递到 .js.erb 视图?

谢谢!

【问题讨论】:

  • 您的意思是从控制器到 js.erb 文件的“对话”,或者您在说哪个循环? '如何将局部变量从循环传递到 .js.erb 视图?'
  • 您的控制器方法将呈现 reply.html.erb 或 reply.js.erb 而不是 index.*.erb。此外,为了使变量在视图中可见,您需要使用 @conversation 而不是对话。有意义吗?

标签: ruby-on-rails ruby partial-views local-variables mailboxer


【解决方案1】:

我通常不会在应用程序中做太多的 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} 但您的部分应参考

@对话

不是

对话

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多