現在、docx_replace gemを使用して、一連のドキュメントへのデータの挿入を自動化しています。gem は非常に単純です。基本的に、Railsコントローラー内の特別なメソッドで実行されます(ドキュメントから引用):
def user_report
@user = User.find(params[:user_id])
respond_to do |format|
format.docx do
# Initialize DocxReplace with your template
doc = DocxReplace::Doc.new("#{Rails.root}/lib/docx_templates/my_template.docx", "#{Rails.root}/tmp")
# Replace some variables. $var$ convention is used here, but not required.
doc.replace("$first_name$", @user.first_name)
doc.replace("$last_name$", @user.last_name)
doc.replace("$user_bio$", @user.bio)
# Write the document back to a temporary file
tmp_file = Tempfile.new('word_tempate', "#{Rails.root}/tmp")
doc.commit(tmp_file.path)
# Respond to the request by sending the temp file
send_file tmp_file.path, filename: "user_#{@user.id}_report.docx", disposition: 'attachment'
end
end
end
ただし、これによりコントローラーが肥大化したため、これを次のようにサービス オブジェクトに入れようとしました (上記の例を続けます)。
class UserReportService
def initialize(user)
@user=user
end
def user_report_generate
respond_to do |format|
format.docx do
# Initialize DocxReplace with your template
doc = DocxReplace::Doc.new("#{Rails.root}/lib/docx_templates/my_template.docx", "#{Rails.root}/tmp")
# Replace some variables. $var$ convention is used here, but not required.
doc.replace("$first_name$", @user.first_name)
doc.replace("$last_name$", @user.last_name)
doc.replace("$user_bio$", @user.bio)
# Write the document back to a temporary file
tmp_file = Tempfile.new('word_tempate', "#{Rails.root}/tmp")
doc.commit(tmp_file.path)
# Respond to the request by sending the temp file
send_file tmp_file.path, filename: "user_#{@user.id}_report.docx", disposition: 'attachment'
end
end
end
end
そして、コントローラー内で次のことを行いました:
def user_report
UserReportService.new(@user).user_report_generate
end
ただし、コントローラー メソッドを呼び出すと、次のエラーが発生します。
17:58:10 web.1 | NoMethodError (undefined method `respond_to' for #<UserReportService:0x000000041e5ab0>):
17:58:10 web.1 | app/services/user_report_service.rb:17:in `user_report_generate'
17:58:10 web.1 | app/controllers/user_controller.rb:77:in `user_report'
私は Respond_to を読みました。ドキュメントを正しく理解している場合、それはコントローラーに固有のメソッドです (これで問題が説明されます)。どうすればこれを回避できますか?