【问题标题】:Reload specific div on page without refreshing page in rails在页面上重新加载特定的 div 而不在 rails 中刷新页面
【发布时间】:2018-06-18 12:01:05
【问题描述】:

我的 Rails 应用中有一个表单。我使用$("#monday-form").trigger('submit.rails'); 将表单提交作为ajax 请求。但是,一旦提交表单,我希望页面上的特定 div(div ID 为monday-times)刷新,因为该 div 显示用户刚刚输入的信息。我不想刷新整个页面,但由于格式问题我也不想使用部分页面。

此处的表单示例:

可用性/new.html.erb

  <span class = "text-muted" id = "monday-times" data-update-url = "<%= vendor_availabilities_path(@vendor, @availability) %>">
    <%= show_available(0, @vendor.id) %>
  </span>

  <div id= "form-monday">
  <%= simple_form_for @availability, url: vendor_availabilities_path(@vendor), id: "#monday-form" do |f| %>
    <%= f.input :day, as: :hidden, label: false, input_html: { value: 0 } %>
    <%=f.time_select :day_start, label: "Start Time",
      :combined => true,
      :default => Time.now.change(:hour => 8, :min => 00),
      :minute_interval => 30,
      :time_separator => "",
      :start_hour => 6,
      :start_minute => 00,
      :end_hour => 22,
      :end_minute => 30,
      :ampm => true
    %>
    &nbsp; to &nbsp;
    <%=f.time_select :day_end,
      :combined => true,
      :default => Time.now.change(:hour => 22, :min => 00),
      :minute_interval => 30,
      :time_separator => "",
      :start_hour => 6,
      :start_minute => 00,
      :end_hour => 22,
      :end_minute => 30,
      :ampm => true
      %>
    <%= button_tag type: 'submit', class: 'btn btn-sm btn-primary float-right', id: "monday-submit", remote: true do %>
      Save
    <% end %>
  <% end %>
</div>

可用性控制器中的新建/创建操作:

  def new
    @vendor = Vendor.friendly.find(params[:vendor_id])
    if @vendor.user != current_user 
      return render plain: 'Not Allowed', status: :forbidden
    end  
    @availability = Availability.new 
  end 

  def create
    @vendor = Vendor.friendly.find(params[:vendor_id])
    params[:availability].parse_time_select! :day_start
    params[:availability].parse_time_select! :day_end
    if @vendor.user == current_user
      @availability = @vendor.availabilities.create(availability_params)
      if @vendor.valid? == false
        render :new, notice: "Errors were made in your form. Please try again"
      end 
    else 
      return render plain: 'Not Allowed', status: :forbidden
    end  

当用户提交表单时,我希望 span id "monday-times"(在相同的可用性/new.html.erb 页面上重新加载,但没有整页刷新。原因这是必要的,因为这个跨度包含用户提交的时间——一旦他们创建了一个新的表单提交,它应该重新加载以显示提交的数据。

我知道 jQuery 加载功能,我尝试过以这种方式实现它:

$("#monday-submit").click(function(){
    var vendorId = document.querySelector(".availability-header").getAttribute('id');
    $("#monday-form").trigger('submit.rails');
    $("#form-monday").hide();
    $("#monday-times").load("/vendors/" + vendorId + "/availabilities/new");
  });

不幸的是,这不起作用——它刷新了整个页面,并且页面永远不会完全加载。

知道如何使用查询使 div #Monday-times 在提交时重新加载页面刷新和使用部分?

【问题讨论】:

  • 不确定 jquery 是否可行,但 check this out.
  • 你想让 div 用什么刷新? “刷新的 div”来自哪里,如果不是部分的话?
  • @jvillian 我已经编辑了我的问题以使其更清楚。谢谢。

标签: javascript jquery ruby-on-rails ruby


【解决方案1】:

对于这个特定的任务,我们使用 AJAX 请求将我们命中的数据保存到 Rails 操作,并在成功返回(成功代码 200)时使用 jquery 操作 HTML DOM。这是一个简单的例子

$("button").click(function(){
    $.ajax({url: "http://localhost:3000/demo_test", success: function(result){
        $("#div1").html(result);
    }});
}); 

编辑:

如果您在表单提交上执行 ajax 请求或单击提交按钮,那么您需要阻止表单提交。请记住,您不应该从 JS 代码提交表单,因为它会刷新页面,而是使用 AJAX 请求将表单数据发送到 Rails 操作,该操作还可以返回您需要在该特定空间中呈现的文本/html。你也可以使用下面的代码来做同样的事情

$("button").click(function(e){
    e.preventDefault();
    $.ajax({url: "http://localhost:3000/demo_test", success: function(result){
        $("#div1").html(result);
    }});
}); 

【讨论】:

  • 感谢您的回复!我用你给出的例子试过这个。然而,页面只是无限期加载,就像我在原始问题中给出的前一个示例一样。
  • @swilliams 我已经编辑了我的答案以满足您的需要
  • 感谢您的编辑。不幸的是,这只是阻止表单提交。让我确定我理解你。我正在使用remote: :true 和`.trigger('submit.rails')` 来提交我的rails 表单。你是说我不应该这样做,而应该只使用 ajax 请求来提交表单?
  • YES...当你使用remote:true时你不需要手动提交表单
  • 谢谢。但是,和以前一样,即使我使用 e.preventDefault(),这仍然会导致页面无限期重新加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2012-03-06
相关资源
最近更新 更多