Rails 4,如何在create.js.erb中执行控制器特定的操作

时间:2015-10-09 02:04:50

标签: javascript ruby-on-rails ajax

我正在尝试根据发生的页面重新渲染部分内容。我似乎无法让它发挥作用,它始终归我所有。

create.js.erb

$(".cart-text").html("<%= escape_javascript(render 'layouts/cart_text') %>")
<% if controller_name == "homes" && action_name == "pits" %>
    <% product_type = ProductType.where(name: 'Fosa') %>
    <% @products = Product.where(product_type: product_type) %>
<% elsif controller_name == "homes" && action_name == "coffin" %>
    <% product_type = ProductType.where(name: 'Féretro') %>
    <% @products = Product.where(product_type: product_type) %>
<% else %>
    <% actions = ProductType.where("name not in ('Fosa','Féretro')").uniq.pluck(:id) %>
    <% actions = -1 if actions.length == 0 %>
    <% product_type = ProductType.where('id IN (?)',actions) %>
    <% @products = Product.where(product_type: product_type) %>
<% end %>
<% @invoice_product = current_invoice.invoice_products.new %>
$(".list_products").html("<%= escape_javascript(render 'homes/list_products', products: @products, invoice_product: @invoice_product) %>")

2 个答案:

答案 0 :(得分:0)

我终于明白了:

它总是调用相同的控制器,即创建。我需要在所述控制器中创建一个实例变量,以通过该文件访问它。 这是我的最终代码:

$(".cart-text").html("<%= escape_javascript(render 'layouts/cart_text') %>")
<% if @product_type_name == "Fosa" %>
    <% product_type = ProductType.where(name: 'Fosa') %>
    <% @products = Product.where(product_type: product_type) %>
<% elsif @product_type_name == "Féretro" %>
    <% product_type = ProductType.where(name: 'Féretro') %>
    <% @products = Product.where(product_type: product_type) %>
<% else %>
    <% actions = ProductType.where("name not in ('Fosa','Féretro')").uniq.pluck(:id) %>
    <% actions = -1 if actions.length == 0 %>
    <% product_type = ProductType.where('id IN (?)',actions) %>
    <% @products = Product.where(product_type: product_type) %>
<% end %>
<% @invoice_product = current_invoice.invoice_products.new %>
$(".list_products").html("<%= escape_javascript(render 'homes/list_products', products: @products, invoice_product: @invoice_product) %>")

答案 1 :(得分:0)

您在erb条件中拥有的大多数查询都不属于视图,并且它们不必存在于那里。为什么有条件为每个不同的product_type_name“做某事”?

看看每个条件中重复的内容。没有理由在每个条件中重复对product_type的查询,对于@products查询也是如此。没有理由在三个地方重复相同的两个查询,实际上条件似乎没有必要开始。非常草率。 product_type查询基本上没有充分的理由增加了权重和性能损失。如果有一种方法可以使用product_type_id而不是product_type_name,那么您可以继续一起删除product_type查询。如果您真的只能访问@product_type_name,那么您仍然不需要product_type查询也没什么大不了的。想想重复,考虑你为什么要做你正在做的“操作”,然后考虑你想要做什么。

请注意,对于重复复制的product_type查询,唯一更改的是名称。对于每个可能的不同product_type_name,您不需要条件。即使有理由查询ProductType.where(名称:@product_type_name),仍然没有理由重复该查询,当然也不是三次。想想在每个条件中做了什么以及你要查询的是什么!

分解:

使用@product_type_name您正在查询product_types表,因此您可以返回product_type。对@products查询重要的变量是product_type。唯一重要的是你获得product_type并且@product_type_name仅用于获取product_type。这就是事情。没有理由在三个地方复制查询。事实上,一旦你可以一起摆脱它,你甚至不需要查询。

这怎么可能?

考虑重复和条件,他们使用了什么,为什么他们在那里?您不需要多个查询,您使用条件的是什么?要获取@products,您只需要一个查询。如果“product_type”列已经不是外键,那么它应该是。您可以使用@product_type_name而不是更改。您只需要一个带连接的查询,即动态查询。而已。没有不必要的重复条件,以及条件中的重复查询。你可以消除所有的条件,查询可以做你的条件因为它是动态的。不需要基于名称的条件,完全没必要。查询应该能够获得@products,无论@product_type_name是什么,都可以这样做。查询将如下所示:

@products = Product.joins("INNER JOIN product_types ON product_types.id = products.product_type_id").where(product_types: {name: @product_type_name})

使上述联接查询起作用,它消除了所有条件代码和重复查询。花一些时间考虑加入组和group_by。在您的脑海中,想出将相同的两个查询放在几个条件中的想法。弄清楚为什么你认为这是一个很好的方法,并从你的脑海中清除它!另外,请考虑仅提取您将用于@products的属性,除非您不关心性能。