【问题标题】:Replace rails scaffold stylesheet content替换 rails 脚手架样式表内容
【发布时间】:2014-03-13 00:09:31
【问题描述】:

您好,我已经为脚手架生成器制作了一些自定义模板视图并将其放入

lib/templates/erb/scaffold/_form.html.erb
lib/templates/erb/scaffold/edit.html.erb
lib/templates/erb/scaffold/index.html.erb
lib/templates/erb/scaffold/new.html.erb
lib/templates/erb/scaffold/show.html.erb

到目前为止一切都很好,现在我想用一些自定义样式替换scaffolds.css.scss(由脚手架指令生成)文件中的内容。

我已经包含了上述几行中的脚手架.css.scss 或脚手架.css,但没有任何反应。

我已经阅读了这个http://guides.rubyonrails.org/generators.html,但这里只提到了如何跳过 css 生成器,而不是如何替换它

======== 编辑=========

调试发现原来的脚手架文件取自

/home/jgutierrez/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.2.13/lib/rails/generators/rails/scaffold/templates/scaffold.css

.

[6, 15] in /home/jgutierrez/.rvm/gems/ruby-1.9.3-p484/gems/sass-rails-3.2.4/lib/rails/generators/sass_scaffold.rb

   6      class ScaffoldBase < ::Rails::Generators::NamedBase
   7        def copy_stylesheet
   8          dir = ::Rails::Generators::ScaffoldGenerator.source_root
   9          file = File.join(dir, "scaffold.css")
   10          debugger
=> 11          puts    "-------------------------------------------------#{file.path}"
   12          converted_contents = ::Sass::CSS.new(File.read(file)).render(syntax)
   13          create_file "app/assets/stylesheets/scaffolds.css.#{syntax}", converted_contents
   14        end
   15      end

无论如何,有没有替换它被采取的地方?就像模板视图被替换的方式一样?

【问题讨论】:

    标签: html css ruby-on-rails ruby scaffold


    【解决方案1】:

    我不确定,但我认为它没有记录,因为生成器总是在同一个地方复制相同的样式表。所以一旦你的总体布局有点固定,你最好总是跳过这个,因为scaffold.css.scss 大多数时候会弄乱css的其余部分:)

    不确定这是否可行,但根据code,您需要调用文件scaffold.css

    【讨论】:

    • 感谢您的回答,我知道脚手架.css 在哪里被占用。有没有办法在不替换 gem 代码的情况下替换那个地方?我不知道是通过 application.rb 还是类似的东西。
    • 您是在构建 gem,还是在 Rails 项目中执行此操作?
    • 在 Rails 项目中。但是在我修改了默认的脚手架模板之后,我想构建一个可以用简单的实现来替换它的 gem。你能指点我走哪条路吗?从哪里开始
    • 老实说,在 Rails 项目中,我看不到附加值。在 gem 中,我会将 css 存储在 gem 的资产中,并将其包含在项目中。在做脚手架时,我会跳过 css(因为 css 不会因不同的脚手架而改变)。
    【解决方案2】:

    最近我遇到了类似的问题,谷歌把我带到了这里。我想要的是替换生成视图的默认 scss。最后我解决了它,所以我想为以后来这里的任何人分享解决方法。我的环境是 Ruby 2.3.0 和 Rails 5.0,我认为这至少也适用于 Rails 4+。

    作为JGutierrezC的调试,.scss文件是由sass-rails gem而不是原来的railties gem生成的。如果你看一下 sass-rails 的代码,你会发现它只是在../template 下获取文件:

    https://github.com/rails/sass-rails/blob/5-0-stable/lib/rails/generators/scss/assets/assets_generator.rb#L6

    require "rails/generators/named_base"
    
    module Scss
      module Generators
        class AssetsGenerator < ::Rails::Generators::NamedBase
          source_root File.expand_path("../templates", __FILE__)
    
          def copy_scss
            template "stylesheet.scss", File.join('app/assets/stylesheets', class_path, "#{file_name}.scss")
          end
        end
      end
    end
    

    所以如果你只在你的模板目录下放一个 .css 是行不通的,因为生成器总是在目录../template 中搜索模板文件,它不遵循中描述的转换导轨引导。好吧,我们需要做的是覆盖这种行为。让我们走进rails的主要生成器代码:

    https://github.com/rails/rails/blob/5-0-stable/railties/lib/rails/generators.rb#L354

    def self.lookup(namespaces) #:nodoc:
      paths = namespaces_to_paths(namespaces)
    
      paths.each do |raw_path|
        ["rails/generators", "generators"].each do |base|
          path = "#{base}/#{raw_path}_generator"
    
          begin
            require path
            return
          rescue LoadError => e
            raise unless e.message =~ /#{Regexp.escape(path)}$/
          rescue Exception => e
            warn "[WARNING] Could not load generator #{path.inspect}. Error: #{e.message}.\n#{e.backtrace.join("\n")}"
          end
        end
      end
    end
    

    当您在分配path 之后插入一行以打印它的值并调用rails g scaffold ...,您可能会得到如下内容:

    ...
    
    
    "rails/generators/rails/scss/scss_generator"
    "generators/rails/scss/scss_generator"
    "rails/generators/rails/scss_generator"
    "generators/rails/scss_generator"
    "rails/generators/scss/assets/assets_generator"
          invoke    scss
    
    ...
    

    这行显示了rails的生成器查找过程。 being-resuce 块做了一件事——按照包含生成器的顺序找到第一个目录并要求它,然后返回。因此,如果我们在最后一个之前的目录中创建我们的生成器,它可能会被 rails 而不是原来的那个。只需将原始文件复制到您的应用程序工作区:

    (your ruby install path)/ruby-2.3.0/gems/sass-rails-5.0.5/lib/rails/generators/scss/assets/*

    (your app path)/lib/generators/rails/scss/

    并将assets_generator.rb 重命名为scss_generator.rb

    然后再次运行scaffold命令,你会发现输出不一样了:

    ...
    
    "rails/generators/rails/scss/scss_generator"
    "generators/rails/scss/scss_generator"
          invoke    scss
    
    ...
    

    Rails 找到了我们创建的生成器并需要它,太好了!现在 scss_generator 将使用模板 (your app path)/lib/generators/rails/scss/template/stylesheet.scss。所以最后要做的就是自定义它,更改将反映到脚手架的视图 scss。

    如果你想替换默认的scaffold.scss,还有更多的事情要做。您需要将相关方法复制到 scss_generator.rb 中,因为您更改了原始查找路径,rails 不会在原始文件中重新使用它们。

    require "rails/generators/named_base"
    
    module Scss
      module Generators
        class AssetsGenerator < ::Rails::Generators::NamedBase
          source_root File.expand_path("../templates", __FILE__)
    
          def copy_scss
            template "stylesheet.scss", File.join('app/assets/stylesheets', class_path, "#{file_name}.scss")
          end
    
        end
      end
    end
    
    # ruby-2.3.0/gems/sass-rails-5.0.5/lib/rails/generators/scss/scaffold/scaffold_generator.rb
    require "sass/css"
    module Sass
      module Generators
        class ScaffoldBase < ::Rails::Generators::NamedBase
          def copy_stylesheet
            dir = "#{::Rails.application.config.root}/lib/templates/erb/scaffold/"
    
            file = File.join(dir, "scaffold.css")
            converted_contents = ::Sass::CSS.new(File.read(file)).render(syntax)
            create_file "app/assets/stylesheets/scaffolds.#{syntax}", converted_contents
          end
        end
      end
    end
    
    
    # ruby-2.3.0/gems/sass-rails-5.0.5/lib/rails/generators/scss/scaffold/scaffold_generator.rb
    module Scss
      module Generators
        class ScaffoldGenerator < ::Sass::Generators::ScaffoldBase
          def syntax() :scss end
        end
      end
    end
    

    并将copy_stylesheet方法中变量dir的值更改为你放置scaffold.scss的位置,如:

    dir = "#{::Rails.application.config.root}/lib/templates/erb/scaffold/"

    现在你可以随意使用你自己的scaffold.css了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-07
      • 2011-12-20
      • 1970-01-01
      • 2018-03-06
      • 2017-03-13
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多