使用Rails 3.2 Ruby 1.9。
试图找出如何调用不依赖于模型对象的辅助方法。例如,当我编写这样的辅助方法时,我的应用程序有一个Products模型:
module StoreHelper
def units_available (product)
sales = product.line_items.total_product_sale.sum("quantity")
units_available = (product.total_avail - sales)
end
我可以在我的视图中调用它,没有像这样的问题
<% @products.each do |product| %>
<%=units_available(product)%>
<%end%>
然而,当我有这样的帮手时:
module StoreHelper
def current_promo_status (level1_status, level2_status)
if level1_status == "Active"
current_status = "1"
elsif level2_status == "Active"
current_status = "2"
else current_status = "3"
end
end
def discount (current_promo_status)
discount = product.price3 if current_promo_status == 3
discount = product.price2 if current_promo_status == 2
discount = product.price if current_promo_status == 1
end
我无法弄清楚如何将折扣方法调用到我的视图中。我在视图中尝试了以下内容:
<%=discount(current_promo_status)%>
和
<%=products.discount(current_promo_status)%>
我也尝试将方法移动到我的控制器,如下所示:
class StoreController < ApplicationController
include StoreHelper
def discount (current_promo_status)
@discount = product.price3 if current_promo_status == 3
@discount = product.price2 if current_promo_status == 2
@discount = product.price if current_promo_status == 1
end
然后通过
在视图中调用它<%=@discount%>
这样做的正确方法是什么?我很确定这很简单,因为我对编程很陌生。
答案 0 :(得分:0)
“这样做的正确方法是什么?”
将您的方法放在辅助文件中或模型本身中。如果方法在多个模型之间共享,则将它们提取到模块中。
重要的是要注意,视图层中的变量current_promo_status
与模块中的方法current_promo_status()
之间没有链接。因此,在视图层中,需要已定义current_promo_status
变量(例如current_promo_status = 3
)才能在那里调用discount
方法。
products.discount()
没有意义,因为products
可能甚至没有定义,如果是,它将是一个Array类,它没有discount
方法定义。
@
符号用于在控制器(您应该在其中定义变量的值)和视图(您应该在哪里显示这些值)之间共享变量。
因此,在不知道具体细节的情况下,标准布局如下所示:
...
def index
@products = Product.all
end
...
<% @products.each do |product| %>
<% promo_status = product.current_promo_status(product.level1_status, product.level2_status) %>
<% discount = product.discount(promo_status) %>
# display discount as needed
...
<% end %>
...
通常当您需要在视图层中执行此类操作时,您会将方法拉入模型(或模块)以简化所有操作,以便您只需执行product.discount_for_display
之类的操作即可。在视图层中。这称为refactoring
。