1

我正在建立一个论坛,我希望管理员能够在管理控制面板中编辑 css(就像大多数 PHP 论坛一样)。

我已将 css 存储在一个名为样式表的表中。

我需要能够在布局/应用程序的样式表中调用此特定行,以便 css 显示在所有页面上。

我想知道是否有一种方法可以使用 stylesheet_link_tag 来调用数据库表中 css 的位置?

如果不是……我该怎么做?

我试过用这个:Best way to handle dynamic css in a rails app但它不起作用。

编辑:我要做的只是调用数据库而不是调用资产/样式表/布局(<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>) /样式表/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/Error:←[0m ←[31mlet(:stylesheet) { Factory(:stylesheet) }←[0m ←[31mNoMethodError←[0m: ←[31mundefined 方法Factory' for #<RSpec::Core::ExampleGroup::Nested_1 ::Nested_1:0x47793f0>←[0m ←[36m # ./spec/controllers/stylesheets_controller_spec.rb:42:in块(3级别) in '←[0m ←[36m # ./spec/controllers/stylesheets_controller_spec.rb:44:in `block (3 级别) in '←[0m

0.02秒完成←[31m1例,1次失败←[0m

失败的例子:

←[31mrspec ./spec/controllers/stylesheets_controller_spec.rb:43←[0m ←[36m# Style sheetController#show应该有正确的css←[0m

随机种子 18359

4

2 回答 2

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 处理请求的方式感到困惑。我将带您了解时间轴:

  1. 浏览器请求论坛页面。这是由ForumsController#show或类似的东西处理的。

  2. 在前置过滤器或其他过滤器中,您需要以某种方式确定样式表的 id,用于<link>标记。

  3. 您的布局应用程序被包裹在该操作的页面周围,请求结束。

  4. 浏览器注意到它需要请求样式表/javascript,其中之一是您的自定义样式表。

  5. StylesheetsController#show的被调用,样式表被渲染回来。这和所有其他资产请求都已完成。

  6. 现在使用浏览器的用户可以看到自定义 css。

所以你看,@stylesheet页面渲染时没有设置,并且每个控制器每个请求都设置了 istance 变量。不是全球性的。设置只为路线设置@stylesheet它。StylesheetsController#showGET /stylesheets/:id.css

您可能要考虑使用子布局 - http://www.ajostrow.me/thoughts/sublayouts-with-rails-revised

于 2013-10-27T20:16:21.540 回答
0

由于我的样式表位于 admin 命名空间中,我们尝试使用的代码失败了。我想出了一个解决方法,即使它可能不是一个好的做事方法。

我最终直接链接到样式表。它完美地工作,即使它不是传统的或可能被接受的方式。我以后可以找更好的方法,我只需要完成我的项目就可以毕业......

 <link href="/admin/stylesheets/1/" media="screen" rel="stylesheet" type="text/css" />
于 2013-11-03T20:22:21.877 回答