Rails - 从模型中获取值到应用程序布局中
Posted
技术标签:
【中文标题】Rails - 从模型中获取值到应用程序布局中【英文标题】:Rails - getting values from a model into the application layout 【发布时间】:2012-06-21 15:03:47 【问题描述】:我想从模型中获取“current_item.quantity”以在视图中使用 - 即,我希望能够将“当前在您的购物车中的 (x) 个项目”放入应用程序布局视图中。我该怎么做呢?尝试了我能想到的“@total_current_items”等的每一种组合。谢谢!!
如果有帮助,这里是模型代码:
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_product(product_id)
current_item = line_items.find_by_product_id(product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(:product_id => product_id)
current_item.price = current_item.product.price
end
current_item
end
def total_price
line_items.to_a.sum |item| item.total_price
end
def decrease(line_item_id)
current_item = line_items.find(line_item_id)
if current_item.quantity > 1
current_item.quantity -= 1
else
current_item.destroy
end
current_item
end
def increase(line_item_id)
current_item = line_items.find(line_item_id)
current_item.quantity += 1
current_item
end
end
根据要求,这里是视图代码(相关部分):
<% if @cart %>
<%= hidden_div_if(@cart.line_items.empty?, id:'cart') do %>
<div class="row-fluid">
<a class="btn btn-success menu" id="menubutton" href="<%= cart_path(session[:cart_id]) %>">View Cart</a>
</div>
<div class="row-fluid">
You have <%= pluralize(@total_current_items, "item") %>in your cart.
</div>
<% end %>
<% end %>
</div>
编辑:
我已尝试将以下内容放入应用程序帮助程序中,但它不起作用。它要么出现未定义的方法/变量错误消息,要么显示“您的购物车中有 0 件商品”,即使那里有商品也是如此。我已经尝试将@total_items、total_items 等放在视图中引用它,但我是 Rails 新手,不知道该怎么做才能让它工作!
def total_items
@line_items = LineItem.find(params[:id])
@total_items = @line_items.to_a.sum |item| item.total_quantity
end
我哪里错了?
【问题讨论】:
在应用程序布局中显示您尝试过的内容 您要做的是获取购物车中所有商品的列表/数组。然后您可以查看如何获取项目数,即计算数组包含的数量。 @Nobita 我已经添加了应用布局。 @Mark - 我该怎么做呢?抱歉,我是 Rails 新手,所以不熟悉如何操作!谢谢! 你在哪里设置@total_current_items? 【参考方案1】:正如 Nils 指出的那样,您必须分配 @total_current_items
(在您的控制器中),以便您可以访问它。现在查看您的视图代码,我猜您在@cart
中有信息。
在控制器中分配了成员变量@cart
(成员变量,因为它有一个@
)。您也可以在视图中访问控制器中分配的成员变量。
您想了解有多少 line_items 附加到购物车。您已经在检查购物车中是否有任何 line_items(否则您将不会显示您想要实现的目标)。因此,不要检查您的数组是否为空。尝试获取数组的长度,即当前购物车中的 line_items 数量。
【讨论】:
这是应用程序布局 - 所以我仍然可以访问分配在单独控制器中的成员变量吗? 我尝试将代码添加到应用程序帮助程序,但没有成功。我已经把我尝试过的东西放在上面,但无法让它工作 - 如果你能指出我哪里出错了,我将非常感激,谢谢!【参考方案2】:这是一个部分答案,但是 cmets 并不能真正有代码块:
您应该将分配@code
和total_current_items
的代码放在ApplicationController
中作为受保护的方法。然后把它作为一个before_filter,让方法在每个控制器(页面)之前运行
class ApplicationController < ActionController::Base
before_filter :get_cart
protected
def get_cart
@cart = SOMETHING
@total_current_items = SOMETHING
end
end
before_filter - http://guides.rubyonrails.org/action_controller_overview.html#filters
【讨论】:
【参考方案3】:您需要在控制器中分配 total_current_items
才能在您的视图中使用它。
cart
也没有设置,同样如此。
【讨论】:
我该怎么做呢?我已经把我的尝试放在上面——我把它放在应用程序助手中,因为我试图让它对应用程序布局视图可用——这是正确的地方吗?我无法让它工作,所以你能提供的任何帮助都会很棒,谢谢!以上是关于Rails - 从模型中获取值到应用程序布局中的主要内容,如果未能解决你的问题,请参考以下文章