0

在 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%>

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

4

1 回答 1

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

于 2013-09-26T16:11:44.980 回答