【问题标题】:Failed to populate table in haml with database values - Ruby on Rails无法使用数据库值填充 haml 中的表 - Ruby on Rails
【发布时间】:2019-10-02 17:49:57
【问题描述】:

我有一个网站,客户可以在其中购买活动门票,并创建了一个 Reporter::EventTickets 类来为我需要的相关信息生成哈希。 Reporter::EventTickets 在报告控制器中被调用,最终我想在管理报告页面上查看它。

我无法在我的 haml 视图文件中获取要在我的表上显示的信息! 我已经尝试了我能想到的一切,并且完全不知道该怎么做。

信息已成功保存到数据库 (PostgreSQL),并且 EventTickets 类正在正确转换数据(通过 RSpec 测试)。

代码:

class Reporter::EventTickets
  include Virtus.model

  def events
    products.map do |product|
      line_items = LineItem.includes(:order)
        .where("orders.completed_at IS NOT NULL")
        .where(purchasable_type: "Product", purchasable_id: product.id)
        .references(:order)

      ticket_purchases = line_items.map do |line_item|
        order = line_item.order

        [order.bill_address_full_name, order.email, line_item.quantity]
      end
      total = ticket_purchases.reduce(0) { |sum, purchase| sum + purchase.last }

      {
        date: product.event_date,
        name: product.name,
        total: total,
        purchases: ticket_purchases.sort
      }
    end
  end

  private

  def products
    Ticket.where("event_date >= ?", week_ago_in_time_zone).order("event_date ASC")
  end

  def week_ago_in_time_zone
    (Time.current - 7.days).to_date
  end

end

控制器:

def event_tickets
    @reporter = Reporter::EventTickets.new
    @csv_link = admin_reports_event_tickets_path(format: :csv)
    respond_with @reporter
end

型号:

class Order < ActiveRecord::Base
  has_many :line_items, dependent: :destroy
class LineItem < ActiveRecord::Base
  belongs_to :order, touch: true
  belongs_to :purchasable, polymorphic: true
class Product < ActiveRecord::Base
  include Purchasable
  has_many :line_items, as: :purchasable

查看:

= render partial: "admin/shared/header", locals: {title: "Event Ticket Purchases"}
.container-fluid.padded
  = render partial: "admin/shared/notifications"
  .row-fluid.hidden-print
    = link_to "Download CSV", @csv_link, class: "btn btn-blue"
  .row-fluid
    - @reporter.events.each do |event|
      %h3
        = event[:date].strftime("%_m/%e")
        = event[:name]
      .box
        %table.table.table-normal
          %thead
            %tr
              %td Name
              %td Email
              %td Tickets
          %tbody
            - event[:purchases].each do |purchase|
              %tr
                - purchase.each do |column|
                  %td= column
            %tr
              %td{:colspan => "2"}
                %b TOTAL
              %td
                %b= event[:total]

Rails 没有错误,页面加载时带有标题和按钮。该表只是没有填充。

【问题讨论】:

  • 您是否确认@reporter.events 正在返回一个非空的array
  • 刚刚检查过,@reporter.events 正在返回一个空数组。知道为什么它通过 RSpec 测试以提取信息但对真实数据正常工作吗?我知道这一定是我错过的一些简单的事情......
  • 您确定您有满足指定条件的Tickets 吗?您的 RSpec 问题的答案是您可能已将测试数据配置为返回 Ticket 的值,但您的实时数据可能未返回 Ticket 的值。或者,至少这是我的猜测。
  • 就是这样 - 我的测试日期超出了我的规格 - 更改了 week_ago_in_time_zone 以允许从今天开始的所有日期返回一整年并填充表格。谢谢@jvillian!
  • 添加为未来搜索者的答案。请随意投票/接受。

标签: ruby-on-rails ruby haml


【解决方案1】:

在 cmets 中调试后,您的代码很好。有了实时数据,这:

Ticket.where("event_date >= ?", week_ago_in_time_zone).order("event_date ASC")

...但是,返回的是一个空的结果集。所以这个:

products.map do |product|
  ...
end 

...正在返回一个空数组。

您的 RSpec 测试通过了,因为您的测试数据中有满足条件的 Ticket 记录,因此,products.map 返回一个非空数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多