Как мне вернуть хеш из модуля? - PullRequest
0 голосов
/ 12 октября 2018

Пожалуйста, извините за мой английский, если он не идеален.

У меня есть контроллер, в котором я устанавливаю данные для нескольких графиков.В этих методах у меня есть блок, который я использую в нескольких методах, поэтому я создал модуль, чтобы поместить этот код и использовать его в тех методах, где он мне нужен (должен ли я сделать это или просто создать метод в моем контроллере?).

Проблема в том, что возвращаемый хэш в моем модуле равен нулю в моем контроллере (но не в моем модуле).

Не могли бы вы сказать мне, где моя ошибка?Я вызываю метод из моего модуля сразу после if params[:checked] == 'true'

Контроллер:

module Admin
  class AdminController < ApplicationController
    include WeeklyCharts #=> I include my module

    def signup_stats(start_date, end_date)

      customer_signup_chart = {
        type: 'line',
        data: [],
        label: 'New customer registrations'
      }

      freelance_signup_chart = {
        type: 'line',
        data: [],
        label: 'New freelance registrations'
      }

      users = User
        .where('created_at > :start_date AND created_at < :end_date',
          start_date: start_date.beginning_of_day,
          end_date: end_date.end_of_day)
        .select(:created_at, :typology)

      if params[:checked] == 'true'
        set_datasets_labels(start_date, end_date) #=> Method in my module
        users = users.group_by_week(week_start: start_date.strftime('%a').downcase.to_sym, format: '%j %y') { |u| u.created_at }

        loop do
          client_signup_chart[:data] << (users[start_date.to_date.strftime('%j %y')] ? users[start_date.to_date.strftime('%j %y')].count {|u| u.typology == 'customer'} : 0)
          presta_signup_chart[:data] << (users[start_date.to_date.strftime('%j %y')] ? users[start_date.to_date.strftime('%j %y')].count {|u| u.typology == 'freelance'} : 0)
          start_date += 1.week
          break if start_date > end_date
        end

      else
        datasets = { labels: (start_date.to_datetime..end_date.to_datetime).map {|date| I18n.l(date, format: :date)}}
        users =  users.group_by { |u| u.created_at.to_date }

        loop do
          client_signup_chart[:data] << (users[start_date.to_date] ? users[start_date.to_date].count {|u| u.typology == 'customer'} : 0)
          presta_signup_chart[:data] << (users[start_date.to_date] ? users[start_date.to_date].count {|u| u.typology == 'freelance'} : 0)
          start_date += 1.day
          break if start_date > end_date
        end
      end

      datasets[:charts] = [customer_signup_chart, freelance_signup_chart] #=> undefined method `[]=' for nil:NilClass
      datasets
    end
  end
end

Мой модуль:

module WeeklyCharts

    def set_datasets_labels(start_date, end_date)
        start_day = start_date.strftime('%A').downcase.to_sym
        datasets = { labels: (start_date.to_datetime..end_date.to_datetime).map {|date| date.beginning_of_week(start_day = start_day).strftime("From %d/%m to #{date.end_of_week(start_day = start_day).strftime('%d/%m')}")}.uniq}
        datasets[:labels][0] = "From #{start_date.strftime('%d/%m')} to #{start_date.end_of_week(start_day = start_day).strftime('%d/%m')}"
        datasets[:labels][-1] = "From #{end_date.beginning_of_week(start_day = start_day).strftime('%d/%m')} to #{end_date.strftime('%d/%m')}"

        datasets
    end

end

Возникла ошибка:

datasets[:charts] = [customer_signup_chart, freelance_signup_chart]
#=> undefined method `[]=' for nil:NilClass

Кроме того, я могу p datasets из модуля, только в моем контроллере это nil

Если вам нужно больше деталей, пожалуйста, спросите меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...