Ruby on rails RubyonRails:优化代码结构并最小化字符串声明

Ruby on rails RubyonRails:优化代码结构并最小化字符串声明,ruby-on-rails,ruby,string,optimization,refactoring,Ruby On Rails,Ruby,String,Optimization,Refactoring,我有一个模块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("/",

我有一个模块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#u company.subdomain}/reports/{report.reference}”


在我的模块中使用了全局变量,可以有人给一些帮助吗

我可以擦干它,但我不确定代码是否变得更可读

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
模块下载ReportHelper

class我提出这个解决方案,正如Aleksei的回答,我认为你会失去一些可读性

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
模块下载ReportHelper
班