Замените содержимое таблицы стилей rails scaffold

0

Привет, я сделал некоторые пользовательские представления шаблонов для генераторов строительных лесов и

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 (который генерируется командой scaffold) с некоторым пользовательским стилем.

Я включил scaffolds.css.scss или scaffolds.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

В любом случае, чтобы заменить место, откуда оно было взято? как вид замещения шаблонов?

2 ответа

1

Недавно я столкнулся с подобной проблемой, и Google взял меня сюда. Я хочу заменить по умолчанию scss сгенерированного представления. Наконец, я решил это, поэтому хотел бы поделиться обходным решением для тех, кто придет сюда позже. Моя среда - Ruby 2.3.0 с Rails 5.0, и я думаю, что это также работает на Rails 4+.

Как отладка JGutierrezC, файл.scss генерируется жемчугом sass-rails, а не оригинальным драгоценным камнем. И если вы посмотрите на код sass-rails, вы обнаружите, что он просто ../template файл в папку ../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, который не следует за преобразованием, описанным в руководстве по направляющим. Ну, нам нужно переопределить это поведение. Пройдите в основной код генератора рельсов:

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

...

Эта линия показывает процесс обнаружения генератора рельсов. Блок -результирующий блок делает одно: поиск первого каталога с помощью такого порядка, который содержит генератор и требует его, а затем возвращает. Поэтому, если мы создадим наш генератор в каталоге до последнего, его можно было бы использовать рельсами, а не оригинальными. Просто скопируйте исходные файлы в рабочее пространство приложения:

(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.

И если вы захотите заменить файл scaffold.scss по умолчанию, будет немного больше дел. Вам нужно скопировать связанные методы в scss_generator.rb, поскольку вы изменили исходный путь поиска, и рельсы не будут повторно дублировать их в исходных файлах.

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

И измените значение переменной dir в методе copy_stylesheet на то, где вы помещаете свой scaffold.scss, например:

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

Теперь вы можете использовать свой собственный scaffold.css, как хотите!

1

Я не уверен, но я думаю, что это не документировано, потому что генератор всегда копирует одну и ту же таблицу стилей на том же месте. Итак, как только ваш общий макет немного исправлен, вам лучше всегда пропустить это, потому что scaffold.css.scss большую часть времени испортил остальную часть css :)

Не уверен, что это сработает, но в соответствии с кодом вам нужно вызвать файл scaffold.css.

  • 0
    благодаря вашему ответу я знаю, где находится scaffold.css. Есть ли какой-нибудь способ заменить это место без замены кода драгоценного камня? Я не знаю, если по application.rb или что-то в этом роде.
  • 0
    Вы строите драгоценный камень, или вы делаете это внутри проекта рельсов?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню