我创建了一个小应用程序,它从GNUCash导出的sqlite3数据库生成报告(主要是PDF)。我将应用程序与可能与其他当前正在使用GNUCash的VFW帖子共享或者使用纸质总帐分享。我称之为准API,大多数报告都可以用HTML和PDF生成,也可以只发送数据。在我分离它之前,我尝试了一种多数据库方法,将sqlite3数据库与我的主postgresql数据库一起添加到我的database.yaml中。它有效,但这使分享的可能性变得困难,我对这种方法持怀疑态度。
对于PDF(生成的虾)一切都很好。我使用RestClient从不同端口上的同一台机器上运行的pdf服务器获取报告。例如,要生成总帐管理系统,可以调用此控制器获取操作:
def ledger_pdf
resp = RestClient.get "http://localhost:8600/ledgers/#{params[:id]}/ledger_pdf"
send_data resp.body, filename: "Ledger#{params[:id]}",
type: "application/pdf",
disposition: "inline"
end
在pdf服务器上,此操作会响应
def ledger_pdf
pdf = Pdf::Ledger.new(view_context,params)
send_data pdf.render, filename: "Ledger#{params[:id]}",
type: "application/pdf",
disposition: "inline"
end
获取HTML版本变得更具挑战性!在pdf服务器上,我有一个单页菜单,列出了所有可用的报告,一些按日期列出,另一些列出了收集路径。这是为了分享'某人只需要报告而没有其他铁路应用程序执行其他操作的版本。服务器可以独立运行在某个盒子上。
而不是从数据中获取数据并在主应用程序上创建页面,我从pdf服务器获取iframe标签中的菜单。当我发现这一点时,我觉得这很有效:
<iframe src="http://localhost:8600/ledgers/" width="100%" height="100%" id="rails_iframe">error!</iframe>
在我的机器上调用了localhost:8600
(它正在运行一个开发版本并欺骗我以为它正在运行!)而不是在生产服务器上。经过一番研究后,我发现你无法做到这一点。我想对浏览器隐藏了对localhost:8600
的RestClient调用,但iframe调用不是。
我想我可以使用相同的RestClient方法获取HTML版本并返回text / html并使用nokogiri以某种方式获取body / html和yield
,如果我知道如何做到这一点。
html.slim非常简单,我可以在获取数据后在主服务器上复制它,但是我有两个代码库需要维护。
另一种方法是使它成为一个真正的API,并使其公开,以便iframe方法可行,我试图避免(身份验证和所有这些)。
我想我的问题是,是否有人有其他方法,或者可以改进或指出我的方法。
答案 0 :(得分:0)
您只需要在“pdf”服务器上添加另一个操作,该服务器将呈现菜单:
def menu
render json: {first: 'first/report', second: 'second/report'}
end
然后从主服务器(面向用户)获取该菜单:
def menu
resp = RestClient.get ...
# parse resp.body to get menu structure
# convert JSON response from pdf server to HTML with your ERB template
@menu_items = ...
end
然后在主服务器上只有路由来传递来自收集服务器的信息,例如:
get "reports/:collection/:date/:report", to: 'reports#fetch'
# then in your controller
def fetch
resp = RestClient.get "...#{params[:collection]}/#{params[:date]}/#{params[:report]}
...
end
就个人而言,我不会使用Rails服务器进行pdf生成。我会使用cron脚本运行Ruby脚本进行PDF生成,然后我会将它们上传到S3或其他一些云存储。我的Rails服务器只会返回该S3文件的链接。