Привет, я сделал некоторые пользовательские представления шаблонов для генераторов строительных лесов и
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
В любом случае, чтобы заменить место, откуда оно было взято? как вид замещения шаблонов?
Недавно я столкнулся с подобной проблемой, и Google взял меня сюда. Я хочу заменить по умолчанию scss сгенерированного представления. Наконец, я решил это, поэтому хотел бы поделиться обходным решением для тех, кто придет сюда позже. Моя среда - Ruby 2.3.0 с Rails 5.0, и я думаю, что это также работает на Rails 4+.
Как отладка JGutierrezC, файл.scss генерируется жемчугом sass-rails, а не оригинальным драгоценным камнем. И если вы посмотрите на код sass-rails, вы обнаружите, что он просто ../template
файл в папку ../template
:
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, как хотите!
Я не уверен, но я думаю, что это не документировано, потому что генератор всегда копирует одну и ту же таблицу стилей на том же месте. Итак, как только ваш общий макет немного исправлен, вам лучше всегда пропустить это, потому что scaffold.css.scss
большую часть времени испортил остальную часть css :)
Не уверен, что это сработает, но в соответствии с кодом вам нужно вызвать файл scaffold.css
.