无论ruby if语句如何,js.erb视图都会运行所有js代码

时间:2014-04-04 14:42:03

标签: javascript jquery ruby-on-rails

我正在使用rails控制器和js.erb视图中的js格式在提交表单时执行一些html更改。在这个js.erb文件中,有多个ruby if语句。无论if语句是true还是false,都会检索所有部分(根据Chrome Network选项卡)。只有在html中执行了正确的操作,但如果我从操作中删除if语句,这些额外的js操作会导致时间接近1秒vs 54 ms。我想知道是否有一种方法可以在满足适当条件时运行js代码。感谢。

js.erb文件

$("#edit_time_modal_<%= @order.id %>").modal("hide");
<% new_time = @order.order_start_date_time %>
<% if @order_date != @order.order_start_date_time %>
  <% end_of_day = Time.zone.now.end_of_day %>
  <% if @order_date < end_of_day && new_time < end_of_day %>
    $("#order_details_<%= @order.id %>").replaceWith('<%= j(render 'order_details', todays_order: @order) %>');
    $("#dashboard_orders_table").replaceWith('<%= j(render 'orders_table') %>');
    $("#dashboard_totals").replaceWith('<%= j(render 'dashboard_totals') %>');
    $(".select_order").replaceWith('<%= j(render 'new_delivery_select_order') %>');
  <% elsif @order_date < end_of_day && new_time > end_of_day %>
    $("#dashboard_order_row_<%= @order.id %>").remove();
    $("#dashboard_totals").replaceWith('<%= j(render 'dashboard_totals') %>');
    $("#tom_orders").replaceWith('<%= j(render 'tom_orders') %>');
    $("#tom_totals").replaceWith('<%= j(render 'tom_totals') %>');
    $(".select_order").replaceWith('<%= j(render 'new_delivery_select_order') %>');
    $("#tom_orders_date").replaceWith('<%= j(render 'tom_orders_date') %>');
  <% elsif @order_date > end_of_day && new_time < end_of_day %>
    $("#tom_order_<%= @order.id %>").remove();
    $("#tom_totals").replaceWith('<%= j(render 'tom_totals') %>');
    $("#dashboard_orders_table").replaceWith('<%= j(render 'orders_table') %>');
    $("#dashboard_totals").replaceWith('<%= j(render 'dashboard_totals') %>');
    $(".select_order").replaceWith('<%= j(render 'new_delivery_select_order') %>');
    $("#tom_orders_date").replaceWith('<%= j(render 'tom_orders_date') %>');
  <% elsif @order_date > end_of_day && new_time > end_of_day %>
    $("#tom_orders").replaceWith('<%= j(render 'tom_orders') %>');
    $("#tom_totals").replaceWith('<%= j(render 'tom_totals') %>');
    $("#tom_orders_date").replaceWith('<%= j(render 'tom_orders_date') %>');
  <% end %>
<% end %>

$("#edit_time_modal_<%= @order.id %>").replaceWith('<%= j(render 'edit_time', order: @order) %>');

控制器操作

def update_order_time
    @order = Order.find(params[:order_id])
    if params[:extras].present?
      @order.update_attributes(...)
    else
      @order.update_attributes(...)
    end
    @order_date = params[:order_date]
    if Order.tomorrows_orders.present?
      @tomorrows_orders = Order.tomorrows_orders.order(:order_start_date_time)
    elsif Order.day_after_tom_orders.present?
      @tomorrows_orders = Order.day_after_tom_orders.order(:order_start_date_time)
    elsif Order.three_days_orders.present?
      @tomorrows_orders = Order.three_days_orders.order(:order_start_date_time)
    elsif Order.four_days_orders.present?
      @tomorrows_orders = Order.four_days_orders.order(:order_start_date_time)
    else
      @tomorrows_orders = []
    end
    respond_to do |format|
      format.js
    end
  end

1 个答案:

答案 0 :(得分:0)

if(<%= @order_date == @order.order_start_date_time %>) {
  // do something ...
} else {
  // do something different ...
}

上面的代码将在客户端运行所有代码,无论if语句结果如何(即两者都做了什么并做了不同的事情)

<% if @order_date != @order.order_start_date_time %>
  // do this only
<% else %>
  // do that only
<% end %>

这将只基于if语句运行一组代码(即仅“仅执行此操作”或“仅执行此操作”)