【问题标题】:How to render controller variables in view using Ajax/Ruby on Rails?如何使用 Ajax/Ruby on Rails 在视图中呈现控制器变量?
【发布时间】:2017-09-06 18:10:58
【问题描述】:

我正在尝试显示两个日期之间的某些统计数据(两个下拉菜单)。

我的控制器有以下方法:

def data_stats

    data_between_two_dates = Data.where(:created_at => params[:created_at1]..params[:created_at2])
    @data_count = data_between_two_dates.count
    @gold_data_count = data_between_two_dates.joins(:status).where(status: DataStatus.find(8)).count
    puts(@data_count)
    puts(@gold_data_count)

我希望能够在我的视图中显示以下变量:data_countgold_data_count,就在从我从数据库中填充的下拉列表中选择两个日期之后。

观点如下(/views/data_stats/data_stats.html.erb):

<select class="my-date" id="created_at1">
 <option value="" selected>-- Select Date --</option>
 <% datadate = Data.order(created_at: :desc).all %>
  <% datadate.each do |data| %>
   <%= content_tag(:option, data.created_at, value: data.created_at) %>
 <% end %>
</select>

<select class="my-date" id="created_at2">
 <option value="" selected>-- Select Date --</option>
 <% datadate = Data.order(created_at: :desc).all %>
  <% datadate.each do |data| %>
   <%= content_tag(:option, data.created_at, value: data.created_at) %>
 <% end %>
</select>

<div id="data_stats">
<label class="col-sm-2 control-label">Data count</label>
  <span id="data_count"><%= @data_count %></span>
<label class="col-sm-2 control-label">Gold Data count</label>
  <span id="gold_data_count"><%= @gold_data_count %></span>
</div>

在同一个视图中,在底部我有 Ajax 查询:

<script type="text/javascript">

 $(document).ready(function() {
  $('.my-date').on('change', function() {
   var data = {}

   $('.my-date').each(function() {
    if($(this).val()) {
      data[$(this).attr("id")] = $(this).val();
    }
  });
  console.log(data); 
  // After selecting the two dates 
  //the above print of `data` gives me this: 
  //`Object { created_at1: "2016-12-08 16:42:51 UTC", created_at2: "2017-05-23 06:11:02 UTC" }`

  if(Object.keys(data).length > 1) {
    $.ajax({
      type: "GET",
      url:  "<%= admin_data_stats_path%>",
      data: Object.keys(data),
      success: function (data) {
            console.log("<%= @data_count %>");
            console.log("<%= @gold_data_count %>");
            //Here when I just print the variables the count is always 0
         }   
    });
   }
  });
 });

</script>

奇怪的是,当我在选择日期后检查我的终端时,我可以清楚地看到我在控制器中所做的 puts 的结果(我得到了数据和黄金数据的计数).. 但我不能似乎想出了如何在视图中显示它们。

我错过了什么?

提前感谢您的帮助!

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax


    【解决方案1】:

    console.log 中的 Rails 变量 @data_count@gold_data_count 在页面加载时返回它们的值,但在 ajax 成功时不返回。

    如果你愿意,你的控制器可以部分渲染 json

    respond_to do |format|
      format.js { render json: { html: render_to_string(partial: 'data_stats', locals: { data_count: @data_count, gold_data_count: @gold_data_count }) } }
    end
    

    部分统计_data_stats.html.erb:

    <div id="data_stats">
    <label class="col-sm-2 control-label">Data count</label>
      <span id="data_count"><%= @data_count %></span>
    <label class="col-sm-2 control-label">Gold Data count</label>
      <span id="gold_data_count"><%= @gold_data_count %></span>
    </div>
    

    并在你的js中使用,比如

    $.ajax({
      type: "GET",
      url:  "<%= admin_data_stats_path%>",
      data: Object.keys(data),
      dataType: 'json'
    }).done((response) => {
      $('#data_stats').replaceWith(response.html)
    })
    

    【讨论】:

    • 非常感谢您的回答!不过我很困惑,当我将渲染 json 放在控制器中时,我会在完整的视图中得到响应,没有下拉菜单,只是 json 的结果,并且我认为计数仍然是 0,因为我没有选择任何东西。 . 从下拉列表中选择日期(最初在视图中的日期)后,如何在 div 中呈现响应?
    • 我在响应中添加了 html
    • 我的错,在 ajax 选项之后我错过了 }
    • 为什么在 ajax 数据属性中使用 Object.keys(data) 而不是 data?我觉得有问题
    • done 是处理程序,success 是 ajax 选项。你可以了解更多here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多