- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 ruby 2.2 和 rails 4.2。
在我的应用程序中,有许多 CSS 和 JS 文件,我只想在需要时从服务器加载这些文件。但是每当我使用样式表链接标记从供应商的独立文件夹调用样式表时,我都没有路由匹配错误
ActionController::RoutingError (No route matches [GET] "/vendor/theme/assets/stylesheets/application.css"):
application.css 是我单独的 list 文件和包含许多 css 文件的文件夹 vendor/theme/assets/stylesheets/
。
我已经尝试将路由添加到“Rails.application.config.assets.paths”,但仍然无法正常工作。
我尝试将公用文件夹用于相同目的,但仍然无法正常工作。
是否可以在不预编译这些 Assets 的情况下为它们提供服务,因为只有一些单独的页面需要这些 Assets 。请建议。
编辑:
我正在阅读本教程
http://railscasts.com/episodes/279-understanding-the-asset-pipeline?autoplay=true
Assets 文件夹中的 Assets 工作正常 http://localhost:3000/assets/application.css
但是 http://localhost:3000/vendor/theme/assets/stylesheets/application.css
给出了找不到路由的错误
最佳答案
从您上面发布的代码来看,您似乎在尝试在 Rails 应用程序中实现 css 主题。如果你,这就是我的方式在我的应用程序中实现了主题功能。
每当管理员更改主题文件并更新它时,一个已编译的 css 文件在具有主题名称的 public/assets/themes/文件夹。那个文件是由应用程序根据当前应用的主题选取。 (我可以如果这是您正在寻找的,请提供代码。)
要仅向某些特定页面提供 Assets ,您需要实现某种逻辑来加载基于它的 Assets 。例如。 Controller 特定 Assets :check here.
选项 1 的更新
我有主题资源,我在其中保存了主题名称和两种主题颜色(您可以使用更多)。
这是我的 View 表单的样子:
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :color1 %><br>
<%= f.text_field :color1 %>
</div>
<div class="field">
<%= f.label :color2 %><br>
<%= f.text_field :color2 %>
</div>
这是我的 ThemesController 文件的样子:
class ThemesController < ApplicationController
after_action :compile_theme, only: [:create, :update]
THEME_PATH = 'app/assets/'
PATH = THEME_PATH + '/themes'
def new
@theme = Theme.new
end
def edit
@theme = Theme.find(params[:id])
end
def create
@theme = Theme.new(theme_params)
if @theme.save
# Create a scss theme file
write_theme_file
redirect_to @theme, notice: 'Theme was successfully created.'
else
render :new
end
end
def update
@theme = Theme.find(params[:id])
if @theme.update(theme_params)
# Create/Update a scss theme file, you can check for file exists
write_theme_file
redirect_to @theme, notice: 'Theme was successfully updated.'
else
render :edit
end
end
private
def write_theme_file
file = PATH + name + '.scss'
body = "$color1: #{@theme.color1};\n$color2: #{@theme.color2};"
File.write(file, body)
end
def compile_theme
file = PATH + name + '.scss'
theme_body = ''
if File.exists?(file) && File.exists?(THEME_PATH + 'theme.scss')
file = File.open(file)
theme_body = file.read
file.close
file = File.open(THEME_PATH + 'theme.scss')
theme_body = theme_body + file.read
file.close
else
colors = ''
end
env = if Rails.application.assets.is_a?(Sprockets::Index)
Rails.application.assets.instance_variable_get('@environment')
else
Rails.application.assets
end
Dir.mkdir(Rails.root + 'public/assets/themes') unless Dir.exists?(Rails.root + 'public/assets/themes')
asset_file = File.join(Rails.root, 'public', asset_path(name))
File.delete(asset_file) if File.exists?(asset_file)
body = ::Sass::Engine.new(theme_body, {syntax: :scss, cache: false, read_cache: false, style: :compressed}).render
File.write(File.join(Rails.root, 'public', asset_path(name)), body)
end
def asset_path(name)
digest = Digest::MD5.hexdigest(name)
"assets/themes/#{name}-#{digest}.css"
end
def name
return @theme.name.downcase
end
def theme_params
params.require(:theme).permit(:name, :color1, :color2)
end
end
Controller 方法说明:
创建或更新新主题时,它会存储主题并使用主题名称和定义的颜色值在 app/assets/themes 中创建一个新的 .scss 文件。
css Assets 文件的编译和创建发生在创建/更新操作完成之后。 compile_theme 方法查找 theme.scss(示例在底部)文件(我已经在 app/assets/stylesheets/文件夹中创建了基本主题颜色变量)并用当前颜色值替换 $color1 和 $color2 变量主题文件。生成的 css 数据保存在 theme_body 变量中。
body = ::Sass::Engine.new(theme_body, {syntax: :scss, cache: false, read_cache: false, style: :compressed}).render
File.write(File.join(Rails.root, 'public', asset_path(name)), body)
最后两行将在 public/assets/themes 中创建一个新文件,其中包含生成的 theme_body css 内容和带有 theme_name 和 digest 的文件名。
现在您需要在每一页中选取文件。为此,在 application_controller.rb 文件中,定义这个
before_filter :set_theme
private
def set_theme
@theme = Theme.first # or change theme according to params
end
最后,您需要在布局文件中选取主题文件。所以,在 layouts/application.html.erb 文件中添加:
<% if @theme.present? %>
<% digest = Digest::MD5.hexdigest(@theme) %>
<%= stylesheet_link_tag asset_url("assets/themes/#{@theme}-#{digest}.css") %>
<% end %>
仅供引用,这是我的 theme.scss 文件的样子:
body {
background-color: $color1;
}
#header-wrapper, footer {
background-color: $color2;
}
就是这样。希望这可以帮助。如果您有任何问题,请告诉我。
关于ruby-on-rails - Rails 供应商 Assets 未提供服务.. 未找到路由错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37315246/
Java 文档说 CompletableFuture:supplyAsync(Supplier supplier)在 ForkJoinPool#commonPool() 中运行任务而 Completa
我正在尝试设置 IVR,或者更具体地说是使用 Asterisk 的自动接线员。除了简单的自动菜单系统之外,我不想要任何花哨的东西,而不是调用分机(现在),如果按下 1,只需调用同一条电话线 (POTS
当我尝试从 Symfony2 项目根运行以下命令时 php bin/vendors install 我收到以下错误: Could not open input file: bin/vendors 我对
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我正在开发一个涉及用户位置检测的 Android 应用程序。我想知道的是,这个 -> LocationManager.GPS_PROVIDER 是如何工作的? 它是使用手机中的 GPS 系统还是使用移
我不知道如何编写代码以在可能的情况下选择网络提供商,或者如果网络不可用则选择 GPS 提供商。我怎样才能改变代码来得到这个。这是我的第一个 Android 应用程序,我尝试这样做但没有成功。 pack
我不是 MySQL 专家,我必须为我的水平设计一个相当复杂的数据库。 我现在面临的问题在于同一个表(公司的宏观类别)中存在供应商-客户关系: 宏表 id name mega_i
我希望至少有人能在这里为我指明正确的方向。 我的业务需要开放式身份验证。 但是,不要使用其他服务,如facebook 或 google 等。 我们有一个成员(member)数据库 - 一个标准的 as
如果我需要一个变量的 ThreadLocal,是否还需要使用 Supplier(也是线程安全的)? 例如,Supplier 是否不需要在这里实现线程安全? private ThreadLocal> m
我在 brunch@1.7.6 没有编译 bower_component css 文件时遇到问题。类似于 Separating app and vendor css in Brunch .只有 css
我正在使用 select2在 angular 项目中(使用自耕农)。 Select2 css 位于以下目录中: bower_components/select2/select2.css bower_c
在我的 Rails 应用程序目录中,vendor/plugins 和 vendor/assets/stylesheets 存在(两者都是空的)。我想创建 javascripts 文件夹。我可以手动创建
我的代码 fragment 是: mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if
我继承了一个 Hadoop 安装,我很想知道以前的管理员是如何安装它的,它是从哪里来的。我是 Hadoop 的新手,但似乎以前的管理员简单地从源代码安装了 Apache Hadoop(而不是使用 Cl
我是 Ionic 2 的新手,正在尝试学习所有介绍如何添加提供程序的在线教程。 Ionic 似乎更改了生成的应用程序结构。有人可以给我一个例子,说明如何使用当前的 Ionic 2 应用程序结构执行此操
为什么供应商只支持无参数构造函数? 如果存在默认构造函数,我可以这样做: create(Foo::new) 但是如果唯一的构造函数需要一个字符串,我必须这样做: create(() -> new Fo
我已经通过 docker-compose 构建了一个容器,这里是 .yml: gateway: build: . image: sng container_name: sn
虽然不是直接的编程问题,但我想我可以在这里找到最佳答案。 为什么 USB-IF 监管供应商 ID 的使用并出售它们? 想要编写开源驱动程序的人或想要 2,000 美元会产生巨大影响的小公司会发生什
我正在使用 laravel-analytics ( https://github.com/spatie/laravel-analytics/ ) 并已在本地安装了所有内容,工作正常。 但是,每当我尝试
有没有一种方法/测试工作流程 - 如果我想从 gui 读取字符串内容并将其放入 ArrayList 中,然后将其写入 .xlsx 文件并使用该文件作为数据提供程序。如果是的话,我可以获得它的@test
我是一名优秀的程序员,十分优秀!