Ruby on rails RubyonRails:优化代码结构并最小化字符串声明
我有一个模块DownloadReportHelper和4个方法,它们包含并返回许多几乎相似的字符串声明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("/",
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
班