Ruby on rails: оптимизировать структуру кода и минимизировать объявление строк - PullRequest
0 голосов
/ 26 октября 2018

У меня есть модуль DownloadReportHelper и 4 метода, которые содержат и возвращают множество строк объявления, которые почти одинаковы.

module DownloadReportHelper

  def self.pdf_file_name(report)
    report_date         = report.created_at.strftime("%y-%m-%d")
    contract_name       = report.activities[0].contract.name.gsub("/", "_")
    [ contract_name, report_date, report.reference.to_s ].join('_')
  end

  def self.generate_public_and_internal_pdf(report, current_company)
    FileUtils.mkdir_p( "tmp/pdf/#{current_company.subdomain}/reports/#{report.reference}" )
    [ generate_public_pdf(report, current_company), generate_internal_pdf(report, current_company) ]
  end

  def self.generate_public_pdf(report, current_company)
    attachement_name = pdf_file_name(report)
    public_pdf = ReportPdf.new(current_company, report, [])
    public_pdf.generate_file( "#{current_company.subdomain}/reports/#{ report.reference }/#{ attachement_name }.pdf" )
    "#{ Rails.root }/tmp/pdf/#{current_company.subdomain}/reports/#{ report.reference }/#{ attachement_name }"
  end

  def self.generate_internal_pdf(report, current_company)
    attachement_name = pdf_file_name(report) + "_internal"
    internal_pdf = ReportPdf.new(current_company, report, [], "internal")
    internal_pdf.generate_file( "#{current_company.subdomain}/reports/#{ report.reference }/#{ attachement_name }.pdf" )
    "#{ Rails.root }/tmp/pdf/#{current_company.subdomain}/reports/#{ report.reference }/#{ attachement_name }"
  end
end

Я хочу настроить код и минимизировать объявление путей строк, например: "tmp / pdf / # {current_company.subdomain} / reports / # {report.reference}"

в моем модуле, используя глобальные переменные, кто-нибудь может помочь, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я предлагаю это решение, поскольку Алексей отвечает, я думаю, вы потеряете некоторую читабельность.

module DownloadReportHelper
  class << self
    def pdf_file_name(report)
      report_date         = report.created_at.strftime("%y-%m-%d")
      contract_name       = report.activities[0].contract.name.gsub("/", "_")
      [ contract_name, report_date, report.reference.to_s ].join('_')
    end

    def generate_public_and_internal_pdf(report, current_company)
      FileUtils.mkdir_p( "tmp/pdf/#{dirname(report, current_company)}" )
      [ generate_public_pdf(report, current_company), generate_internal_pdf(report, current_company) ]
    end

    def generate_public_pdf(report, current_company)
      @pdf_type = :public
      @pdf_instance = ReportPdf.new(current_company, report, [])
      generate_file(report, current_company)
    end

    def generate_internal_pdf(report, current_company)
      @pdf_type = :internal
      @pdf_instance = ReportPdf.new(current_company, report, [], "internal")
      generate_file(report, current_company)
    end

    private 

    def generate_file(report, current_company)
      @pdf_instance.generate_file(filepath(report, current_company))
      "#{Rails.root}/tmp/pdf/#{filepath(report, current_company)}"
    end

    def dirname(report, current_company)
      "#{current_company.subdomain}/reports/#{report.reference}"
    end

    def filepath(report, current_company)
      attachement_name = pdf_file_name(report)
      if @pdf_type == :internal
        attachement_name = attachement_name + '_internal'
      end
      "#{dirname(report, current_company)}/#{attachement_name}.pdf"
    end
  end
end

Если вам на самом деле не нужны generate_public_pdf и generate_internal_pdf для вызова из класса, а просто вспомогательные функции для generate_public_and_internal_pdf, тогда вы можете также сделать переменные класса report и current_company и увеличить читаемость.

Решение зависит от того, как вы собираетесь использовать код.

0 голосов
/ 26 октября 2018

Мне удалось СУШИТЬ, но я не уверен, что код стал более читабельным.

module DownloadReportHelper
  class << self
    def pdf_file_name(report)
      report_date = report.created_at.strftime("%y-%m-%d")
      contract_name = report.activities[0].contract.name.gsub("/", "_")
      [contract_name, report_date, report.reference].join('_')
    end

    def path(company, report, prefix = [], suffix = [])
      [
        *prefix,
        current_company.subdomain, reports, report.reference,
        *suffix
      ]
    end

    def generate_pdf(report, current_company, type)
      args = [current_company, report, []]
      args << type unless type == "public"
      pdf = ReportPdf.new(*args)

      path = path(*args, [], "#{pdf_file_name(report)}.pdf")
      pdf.generate_file(path.join("/"))
      [Rails.root, "tmp", "pdf", *path].join("/")
    end

    TYPES = %w[internal public]

    TYPES.each do |type|
      define_method("generate_#{type}_pdf") do |report, current_company| 
        generate_pdf(report, current_company, type)
      end
    end

    def generate_public_and_internal_pdf(report, current_company)
      FileUtils.mkdir_p(path(current_company, report, %w[tmp pdf])
      TYPES.map { |type| generate_pdf(report, current_company, type)}
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...