【问题标题】:How to load different assets based on data pulled from database?如何根据从数据库中提取的数据加载不同的资产?
【发布时间】:2013-12-07 16:22:40
【问题描述】:

我正在为有可能上传自己的设计(图像/CSS/JavaScript)的客户提供多租户服务,这让我想知道,为不同的客户包含不同资产的合适方式是什么?如何在 RoR 上实现这样的功能?我已经通过使用唯一的登录凭据来区分每个客户的主题。

我塞满了 Rails 的文档,没有任何关于加载不同资产集的相关数据。另外,我搜索过 SO/Google,但找不到任何有用的东西。

如何根据不断变化的变量动态加载不同的资产(很可能是从数据库中提取的结果)。我正在寻找类似的东西:

use_assets(current_tenant.theme_name) #current tenant's theme is loaded(CSS/JS/Images)

【问题讨论】:

  • 如何根据用户将所有资产定向到特定的子目录?只需将该目录添加到所有路径即可。
  • 客户如何上传他们的设计?他们是用回形针或载波之类的东西上传它们吗?在 dB 中编辑 TEXT 列?
  • @AndyV 他们的想法是我们 - 供应商 - 专门为客户创建设计并进行设置。他们唯一做的就是命名主题。
  • @screenmutt 我们这样做的目的究竟是什么?您的意思是通过将assets 替换为assets/{THEME_NAME} 来修改config.assets.paths,这是否适用于运行时(即,对于每个请求,而不是在服务器初始化时)?
  • 在每个指向 CSS、JavaScript 或图像的链接中,包含额外的目录。换句话说,链接到"/stylesheets/user/style.css" 而不是"/stylesheets/style.css"

标签: ruby-on-rails ruby asset-pipeline multi-tenant paas


【解决方案1】:

我通过使用资产管道渲染默认布局,然后使用 javascript_include_tag 渲染任何客户特定的资产等解决了类似的情况。我还将渲染资产的细节封装到一个帮助程序中,以便顶部我的布局看起来像这样

!!!
%html
  %head
    %title Tenantly
    = stylesheet_link_tag :application
    = javascript_include_tag :application

    - if current_tenant && !current_tenant.theme_name.blank?
      = custom_theme current_tenant.theme_name
    ...

这里客户的 css 可以覆盖基础 css,客户的 js 可以在适当的地方替换标准的 js。这应该可以让您将主题精简到只需要替换的部分。

【讨论】:

  • 我使用了您的方法,但不是每次都对目录路径进行硬编码,而是使用帮助方法,这使我的视图更加清晰。
【解决方案2】:

set the asset path 基于用户

config.assets.prefix = "/path_of_user_12345678"

你说你倒在了文档上。你没看到这个?或者由于某种原因它不起作用?

【讨论】:

  • config.assets.prefix 是一个应用级别配置。它会在应用程序启动时执行一次,而不是每次收到请求时执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
相关资源
最近更新 更多