Пожалуйста, извините за мой английский, если он не идеален.
У меня есть контроллер, в котором я устанавливаю данные для нескольких графиков.В этих методах у меня есть блок, который я использую в нескольких методах, поэтому я создал модуль, чтобы поместить этот код и использовать его в тех методах, где он мне нужен (должен ли я сделать это или просто создать метод в моем контроллере?).
Проблема в том, что возвращаемый хэш в моем модуле равен нулю в моем контроллере (но не в моем модуле).
Не могли бы вы сказать мне, где моя ошибка?Я вызываю метод из моего модуля сразу после 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
Если вам нужно больше деталей, пожалуйста, спросите меня.