Rails应用程序(生产)与同一台机器上的另一个rails应用程序连接

时间:2015-08-05 12:11:34

标签: ruby-on-rails iframe

我创建了一个小应用程序,它从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方法可行,我试图避免(身份验证和所有这些)。

我想我的问题是,是否有人有其他方法,或者可以改进或指出我的方法。

1 个答案:

答案 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文件的链接。