我正在建立一个论坛,我希望管理员能够在管理控制面板中编辑css(就像大多数PHP论坛一样)。
我已将css存储在名为stylesheet的表中。
我需要能够在布局/应用程序的样式表表中调用此特定行 所以css显示在所有页面上。
我想知道是否有办法使用stylesheet_link_tag来调用数据库表中css的位置?
如果没有......我究竟该怎么做?
我尝试使用它:Best way to handle dynamic css in a rails app但它没有用。
编辑:我要做的就是调用资产/样式表/布局(<%= stylesheet_link_tag“应用程序”,媒体:“all”,“data-turbolinks-track”=> true%&gt ;)我调用数据库/ stylesheet / id1.code。
我只需要获取ID 1并从中提取代码并将其作为主要CSS显示在每个页面上。
这是我现在得到的错误:
没有路由匹配{:controller =>“stylesheets”,:action =>“show”,:id => nil,:format =>:css}缺少必需的键:[:id]
样式表控制器
class Admin::StylesheetsController < ApplicationController
caches_page :show # magic happens here
def index
@stylesheets = Stylesheet.all
end
def show
@stylesheet = Stylesheet.find(params[:id])
respond_to do |format|
format.html # regular ERB template
format.css { render :text => @stylesheet.code, :content_type => "text/css" }
end
end
def edit
@stylesheet = Stylesheet.find(params[:id])
end
# When you edit/update the category, update the information
def update
@stylesheet = Stylesheet.find(params[:id])
if @stylesheet.update_attributes(params[:stylesheet].permit!)
redirect_to edit_stylesheet_path
else
render :edit
end
end
end
布局/ Application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Ruby Ibis | <%= yield(:title) %></title>
<link rel="stylesheet" href="<%= stylesheet_path(@stylesheet, format: :css) %>" type="text/css" />
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= csrf_meta_tags %>
<%= render 'layouts/shim' %>
</head>
<body>
<%= render 'layouts/header' %>
<div class="container">
<% flash.each do |key, value| %>
<div class="alert alert-<%= key %>"><%= value %></div>
<% end %>
<%= yield %>
<%= render 'layouts/footer' %>
<%= debug(params) if Rails.env.development? %>
</div>
</body>
</html>
测试结果
$ rspec spec / controllers / stylesheets_controller_spec.rb←[31mF←[0m
故障:
1)StylesheetsController #show应该有正确的CSS ←[31mFailure /错误:←[0m←[31mlet(:stylesheet){工厂(:stylesheet)}←[0m ←[31mNoMethodError←[0米: ←[31]定义方法
Factory' for #<RSpec::Core::ExampleGroup::Nested_1 ::Nested_1:0x47793f0>←[0m ←[36m # ./spec/controllers/stylesheets_controller_spec.rb:42:in
块(3个级别)'←[0m←[36m# ./spec/controllers/stylesheets_controller_spec.rb:44:in`block(3 le '←[0m在0.02秒内完成←[31m1例子,1次失败←[0m
失败的例子:
←[31mrspec./spec/controllers/stylesheets_controller_spec.rb:43←[0m ←[36m#Style sheetsController #show应该有正确的css←[0m
随机种子18359
答案 0 :(得分:3)
现在不要担心缓存。只要看看它是否呈现:
class Admin::StylesheetsController < ApplicationController
respond_to :css
def show
@stylesheet = Stylesheet.find(params[:id])
render text: @stylesheet.code, content_type: "text/css"
end
end
为GET /stylesheets/:id.css
编写测试。在标记中:
<link rel="stylesheet" href="<%= stylesheet_path(@stylesheet, format: :css) %>" type="text/css" />
您似乎对论坛的样式表感到困惑。样式表是一种资源,它使用<link>
标记隐式请求。您将链接添加到样式表作为论坛html页面的一部分。
您的stylesheets/:id.css
路径仅返回css,没有标记。假设样式表模型中的字段被称为:code
的测试将是:
describe '#show' do
let(:stylesheet) { Factory(:stylesheet) }
it 'should have the correct css' do
get :show, id: stylesheet.id
expect(response.body).to eq(stylesheet.code)
end
end
好像你对Rails处理请求的方式感到困惑。我将引导您完成时间表:
浏览器请求论坛页面。这由ForumsController#show
或类似的东西处理。
在过滤器或其他过滤器中,您需要以某种方式为<link>
标记确定样式表的ID。
您的布局应用程序包含在操作页面周围,请求结束。
浏览器注意到它需要请求样式表/ javascripts,其中一个是您的自定义样式表。
调用您的StylesheetsController#show
,然后渲染样式表。此资产申请和所有其他资产申请均已完成。
现在,使用浏览器的用户可以看到自定义css。
所以你看,在呈现页面时没有设置@stylesheet
,每个请求为每个控制器设置一个istance变量。不是全球性的在@stylesheet
中设置StylesheetsController#show
仅为路由GET /stylesheets/:id.css
设置它。
您可能需要考虑使用子布局 - http://www.ajostrow.me/thoughts/sublayouts-with-rails-revised
答案 1 :(得分:0)
由于我的样式表位于admin命名空间中,我们尝试使用的代码失败了。我想出了一个方法,即使它可能不是一个好的做事方法。
我最终直接链接到样式表。即使它不是传统的或可能被接受的方式,它也能完美地工作。我以后可以找一个更好的方法,我只需要完成我的项目毕业......
<link href="/admin/stylesheets/1/" media="screen" rel="stylesheet" type="text/css" />