麻烦调用助手方法Rails 3

时间:2013-09-26 15:11:17

标签: ruby-on-rails methods

使用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%>

这样做的正确方法是什么?我很确定这很简单,因为我对编程很陌生。

1 个答案:

答案 0 :(得分:0)

“这样做的正确方法是什么?”

将您的方法放在辅助文件中或模型本身中。如果方法在多个模型之间共享,则将它们提取到模块中。

重要的是要注意,视图层中的变量current_promo_status与模块中的方法current_promo_status()之间没有链接。因此,在视图层中,需要已定义current_promo_status变量(例如current_promo_status = 3)才能在那里调用discount方法。

products.discount()没有意义,因为products可能甚至没有定义,如果是,它将是一个Array类,它没有discount方法定义。

@符号用于在控制器(您应该在其中定义变量的值)和视图(您应该在哪里显示这些值)之间共享变量。

因此,在不知道具体细节的情况下,标准布局如下所示:

products_controller.rb

...
def index
  @products = Product.all
end

视图/产品/ index.html.erb

...
<% @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