1

我有一个 Rails(带有资产管道的 3.1.3)应用程序,它将被部署为战争。这个应用程序有 ui “主题”。在内部,我在 Rails 应用程序的 assets 目录中只有 .scss 文件(Sass),我让用户在它们之间切换。

我想允许管理员在应用程序部署为战争后向应用程序添加主题(基本上是 .scss 文件)。我怎样才能允许功能而不需要重建/重新编译战争(使用莺)。理想情况下,他们可以添加主题,而无需对 war 文件做任何事情。

我对语言文件也有类似的担忧。有人如何动态地将语言文件添加到已部署的 Rails 应用程序中?

我目前正在生产中预编译资产,即使用 Sass 编写的主题,但如果它有助于解决这个问题,我愿意改变它。我可以在战争之外预编译资产吗?是否可以将资产管道的路径设置到战争之外?

4

3 回答 3

1

Reading about Warbler seems like there's no easy workaround, have the app serve new themes and languages via database

于 2012-08-21T19:52:39.353 回答
1

这就是我想到的。

您必须使用一些 tomcat-apache-httpd 组合

我的建议是预编译文件并让 apache 提供静态内容,不要将其添加到战争中。

一旦你觉得文件的内容需要改变,再次用最新的内容预编译并在服务器上替换它。它不应该要求重新部署战争

您需要进行一些服务器配置以从 Apache 提供静态内容,并让其他调用转到 tomcat。

预编译资产复制公共资产目录并存储在其他地方,并将 apache 配置为/assets从该目录中的所有服务器

检查如何配置mod_jk以从 apache 提供静态资产

http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html 检查配置 Apache 以提供静态 Web 应用程序文件部分

使用proxypass

https://serverfault.com/questions/379667/apache-proxypass-ignore-static-files

https://serverfault.com/questions/156391/what-is-an-ideal-apache-tomcat-setup-with-apache-serving-static-assets

https://www.apachelounge.com/viewtopic.php?t=3907

关于语言文件,如果它们位于资产之外,那么我认为@pito 建议尝试使用一些数据库。

或者,如果文件需要由某个管理员更新,则可以使用相同的缓存技术通过从其他服务器调用它并重新加载文件缓存来缓存整个文件。

任何代码更改都需要重新编译。

你可以在解压后直接在 WEPAPPS 解压目录中添加文件更改文件并重新启动 tomcat,但我认为这对生产环境来说风险太大。

我还没有这样做,但我认为肯定应该工作。

于 2012-08-15T22:26:57.783 回答
1

免责声明:我根本不熟悉 WAR。我的回答可能完全错误,因为我没有这方面的经验。请理解,我发现这是一个有趣的挑战,我想找到一个解决方案。

我不知道当您创建 WAR 存档时应用程序能够做什么。结果我决定使用命令行来进行实际的编译。但是,如果需要,包含sass gem并直接使用编译器应该不会太难。

因为我依赖命令行,所以你必须安装sass gem。然后查看使用命令行界面的README

为了测试,我创建了一个名为Theme以下列的模型。您可能需要更改下面的代码以匹配您现有的模型。

  1. (string) title # the title of the theme
  2. (string) stylesheet_file_name # the name of the file that is saved

在我的表单内部,我使用了不同的字段名称来防止重叠。

<%= f.form_field :styleheet %>

然后在我的控制器内部,我添加了代码来编译上传的 scss 文件并将其移动到公共目录中。

def create
  if params[:theme].has_key?(:stylesheet)

    # create a filename friendly version of the theme name
    file_name = params[:theme][:stylesheet_file_name] = params[:theme][:title].parameterize

    # where to copy the temporary uploaded file to. It is important that we get
    # the original extension. The `sass` command uses the extension to determine how to compile the file
    tmp_file = "#{Rails.root}/tmp/#{params[:theme][:stylesheet].original_filename}"

    # move from /tmp path to within the Rails temp directory
    `cp #{params[:theme][:stylesheet].tempfile.path} #{tmp_file}`

    # create the theme's css file.
    File.open("#{Rails.root}/public/stylesheets/#{file_name}.css", 'w') do |f|

      # compile the .scss file via command line
      parsed_theme = `sass #{tmp_file}`

      # store the contents of the file
      f.write(parsed_theme)
    end

    # remove the temporary file we created earlier
    `rm #{tmp_file}`

    # this key wasn't part of my AR model
    params[:theme].delete("stylesheet")
  end

  # rest of action here ...
end

准备好 css 文件后,您可以layout/application.html.erb使用以下内容将其包含在文件中。

<head>
  <%= stylesheet_link_tag "/stylesheets/#{@current_theme.stylesheet_file_name}" %>
</head>
于 2012-08-25T04:25:00.803 回答