【问题标题】:Refresh Rails Partial with AJAX or JS使用 AJAX 或 JS 刷新 Rails 部分
【发布时间】:2016-11-01 15:06:30
【问题描述】:

我正在开发一个 Rails 应用程序,并且我有一些要在选项卡中呈现的表单部分。

我希望能够提交表单,刷新选项卡内的表单,以及更新其他表单,而不刷新页面。

这是我的应用程序的外观:

这是我的控制器tape_bulk_coc 的显示页面。该页面的主要代码如下:

<div class="large-12 columns large-collapse" style="padding-top: 2%; padding-left: 5%; padding-right: 5%">
  <div class="large-2 columns">
    <ul class="tabs vertical" id="example-vert-tabs" data-tabs>
      <li class="tabs-title" id="job_links"><a href="#panel1v" aria-selected="true">Job Information</a></li>
      <li class="tabs-title" id="job_links"><a href="#panel2v">Lab/Insp/Clr Work</a></li>
      <li class="tabs-title" id="job_links"><a href="#panel3v"><%= @tape_bulk_coc.cli_type.job_type.job_type %> Types</a></li>
      <li class="tabs-title is-active" id="job_links"><a href="#panel4v">Add Samples</a></li>
      <% if @tape_bulk_coc.tape_bulk_coc_samples.any? %>
        <li class="tabs-title" id="job_links"><a href="#panel5v"> <%=@tape_bulk_coc.tape_bulk_coc_samples.count %> Saved Samples </a></li>
      <% end %>
      <li class="tabs-title" id="job_links"><a href="#panel6v">Add Spore Counts ( <%= @missing_spore_count.count %> )</a></li>
      <li class="tabs-title" id="job_links"><a href="#panel7v">CoC Reports</a></li>
      <li class="tabs-title"><a href="#panel8v">New Job</a></li>
      <li class="tabs-title"><a href="#panel9v">All Jobs</a></li>
      <li class="tabs-title"><a href="#panel10v">All Reports</a></li>
    </ul>
  </div>
  <div class="large-10 columns">
    <div class="tabs-content vertical" data-tabs-content="example-vert-tabs">
      <div class="tabs-panel" id="panel1v" style="border-left: solid 1px #f2f2f2">
        <%= render 'jobs/show' %>
      </div>
      <div class="tabs-panel" id="panel2v" style="border-left: solid 1px #f2f2f2">
        <%= render 'jobs/jobtypes' %>
      </div>
      <div class="tabs-panel" id="panel3v" style="border-left: solid 1px #f2f2f2">
        <%= render 'job_types/show' %>
      </div>
      <div class="tabs-panel is-active" id="panel4v" style="border-left: solid 1px #f2f2f2">
        <%= render 'tape_bulk_cocs/show' %>
        <hr>
        <%= render 'tape_bulk_coc_samples/form' %>
      </div>
      <div class="tabs-panel" id="panel5v" style="border-left: solid 1px #f2f2f2">
        <%= render 'tape_bulk_cocs/samples' %>
      </div>
      <div class="tabs-panel" id="panel6v" style="border-left: solid 1px #f2f2f2">
        <%= render 'spore_type_counts/form' %>
      </div>
      <div class="tabs-panel" id="panel7v" style="border-left: solid 1px #f2f2f2">
         <!-- render 'lead_reports/index' %> -->
      </div>
      <div class="tabs-panel" id="panel8v" style="border-left: solid 1px #f2f2f2">
        <%= render 'jobs/form' %>
      </div> 
      <div class="tabs-panel" id="panel9v" style="border-left: solid 1px #f2f2f2">
        <%= render 'jobs/index' %>
      </div> 
      <div class="tabs-panel" id="panel10v" style="border-left: solid 1px #f2f2f2">
        <%= render 'all_reports/index' %>
      </div>
    </div>
  </div>

当页面加载/刷新时,这是设置为活动的选项卡。

我要在提交时刷新的表单位于“添加孢子计数”选项卡中:

当您单击“添加霉菌孢子计数”按钮时,会出现一个包含表单数据和提交按钮的模式窗口。这将提交给spore_type_counts 的控制器

目前,在用户在该模式中提交后,它会关闭,并且页面会刷新回“添加示例”的活动选项卡。

我想要的是不刷新页面,关闭模式,只更新“添加孢子计数”的内容。这意味着,如果他们将孢子计数添加到样本 69-3,那么它将不再显示在该选项卡上,而只会保留其他两个样本。

更新

所以,我在这里遵循了一些说明:https://coderwall.com/p/kqb3xq/rails-4-how-to-partials-ajax-dead-easy

我正在处理的页面是tape_bulk_coc 控制器的显示页面。

在此页面上,我在我的一个标签中呈现spore_type_counts/form。

spore_type_counts/form,简而言之,如下所示:

<div id="test">
   <% if @tape_bulk_coc.tape_bulk_coc_samples.any? %>
      <% @tape_bulk_coc.tape_bulk_coc_samples.each do |cur| %>
         <% if !cur.spore_type_count %>
            <div class="reveal" data-reveal>
               <%= form_for(@spore_type_count, remote: true) do |f| %>
                  "code for the form"
               <% end %>
            </div>
         <% end %>
      <% end %>
   <% end %>
</div>

spore_type_counts_controller.rb

  def create
    @spore_type_count = SporeTypeCount.new(spore_type_count_params)

    respond_to do |format|
      if @spore_type_count.save
        format.js
      end
    end
  end

app/views/spore_type_counts/create.js.erb

$("#test").html("&lt;%= escape_javascript(render partial: 'spore_type_counts/form' ) %&gt;");

当我提交表单时,所有内容都会在数据库中正确提交和更新。响应以 JS 的形式出现,spore_count 被正确添加到 CoC,但模式没有关闭,页面也没有更新。

这是我从服务器看到的响应:

NoMethodError - undefined method tape_bulk_coc_samples' for nil:NilClass: app/views/spore_type_counts/_form.html.erb:12: 行是我现在需要帮助的地方。

如果我理解正确的话,我第一次来到这个页面时,我的tape_bulk_cocs_controller 正在从参数中填充@tape_bulk_coc 对象。我在我的spore_type_counts/form 中使用这个对象,但是当它尝试调用 JS 函数来刷新部分时,该对象不再存在,并且当它在表单中遇到我的第一个条件时出现错误。

那么,我怎样才能得到这个对象并将它传递回部分,以使其全部工作?

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax


    【解决方案1】:

    你错过了一些东西。 请在代码中添加 format.js { something here } 然后在控制器文件夹(spore_type_counts yours 文件夹)中添加一个文件 actionname.js。 然后在js代码中添加一条警告行进行测试。 请记住,如果没有 format.js 行,服务器将作为 HTML 操作执行。 只需检查服务器端日志,如果您使用远程 true,它将直接添加为 JS 操作。 希望

    【讨论】:

    • 我喜欢推荐先阅读服务器日志。它是否以 JS 的形式发送请求。并在客户端检查元素页面,然后检查表单 html。 HTML 是否正确。 remote 只是表单的属性,它没有设置为其他属性的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多