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 并不能真正有代码块:

您应该将分配@codetotal_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 - 从模型中获取值到应用程序布局中的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 使用 SQL 的应用程序布局?

从控制台获取 rails 关联

从解析列中获取值到标签中

rails 5 如何将模型值传递给仪表板?

如何从rails中的api更新用户模型?

如何从 CoreData-Entities 获取一些值到代码中