从挂载的 Rails 引擎 cd 进入一个目录
cd into a directory from a mounted Rails Engine
我有一个 Rails 应用程序,在引擎中安装了 Rails engine. I have created a Rails generator。从 Rails 应用程序调用生成器。生成器的目的是从 Rails 引擎复制一组视图,并将它们添加到 Rails 应用程序的视图文件夹中。
Rails 生成器工作正常,但我需要使用 Ruby class Dir glob method 重构它。
这是我的 views_generator.rb
文件,它工作正常:
class Speaker::ViewsGenerator < Rails::Generators::Base
source_root File.expand_path('../templates', __FILE__)
def generate_participant_views
copy_file "#{copy_path}/participants/_form.html.erb", "#{paste_path}/participants/_form.html.erb"
copy_file "#{copy_path}/participants/edit.html.erb", "#{paste_path}/participants/edit.html.erb"
copy_file "#{copy_path}/participants/index.html.erb", "#{paste_path}/participants/index.html.erb"
copy_file "#{copy_path}/participants/new.html.erb", "#{paste_path}/participants/new.html.erb"
copy_file "#{copy_path}/participants/show.html.erb", "#{paste_path}/participants/show.html.erb"
end
def generate_room_views
copy_file "#{copy_path}/rooms/_form.html.erb", "#{paste_path}/rooms/_form.html.erb"
copy_file "#{copy_path}/rooms/edit.html.erb", "#{paste_path}/rooms/edit.html.erb"
copy_file "#{copy_path}/rooms/index.html.erb", "#{paste_path}/rooms/index.html.erb"
copy_file "#{copy_path}/rooms/new.html.erb", "#{paste_path}/rooms/new.html.erb"
copy_file "#{copy_path}/rooms/show.html.erb", "#{paste_path}/rooms/show.html.erb"
end
private
def copy_path
'../../../../../app/views/speaker'
end
def paste_path
'app/views/speaker'
end
end
我不想写出每个文件,而是想使用 glob 方法遍历给定文件夹中的所有文件。但为了做到这一点,我首先需要进入 Rails 引擎的 views 文件夹。
所以这是我的问题。我如何从我的 Rails 应用程序 进入安装的 Rails 引擎 内的目录?
我想用这样的方法替换上面的 generate_participant_views
方法:
def generate_participant_views
Dir.chdir "#{copy_path}/participants"
all_files = Dir.blob('*')
all_files.each do |file|
copy_file file, paste_path + file
end
end
显然该方法的第一行不起作用,因为它是从 Rails app 内部调用的,而不是引擎。
那么,如何从应用程序的有利位置将目录更改为安装的 Rails 引擎内的文件夹?
谢谢!
我最终采用了不同的方法,通过复制和粘贴整个目录来解决问题。这解决了必须通过 Rails 应用程序手动访问引擎文件的问题。
更新后的方法如下:
def generate_participant_views
directory "#{copy_path}/participants", "#{paste_path}/participants"
end
def generate_room_views
directory "#{copy_path}/rooms", "#{paste_path}/rooms"
end
我有一个 Rails 应用程序,在引擎中安装了 Rails engine. I have created a Rails generator。从 Rails 应用程序调用生成器。生成器的目的是从 Rails 引擎复制一组视图,并将它们添加到 Rails 应用程序的视图文件夹中。
Rails 生成器工作正常,但我需要使用 Ruby class Dir glob method 重构它。
这是我的 views_generator.rb
文件,它工作正常:
class Speaker::ViewsGenerator < Rails::Generators::Base
source_root File.expand_path('../templates', __FILE__)
def generate_participant_views
copy_file "#{copy_path}/participants/_form.html.erb", "#{paste_path}/participants/_form.html.erb"
copy_file "#{copy_path}/participants/edit.html.erb", "#{paste_path}/participants/edit.html.erb"
copy_file "#{copy_path}/participants/index.html.erb", "#{paste_path}/participants/index.html.erb"
copy_file "#{copy_path}/participants/new.html.erb", "#{paste_path}/participants/new.html.erb"
copy_file "#{copy_path}/participants/show.html.erb", "#{paste_path}/participants/show.html.erb"
end
def generate_room_views
copy_file "#{copy_path}/rooms/_form.html.erb", "#{paste_path}/rooms/_form.html.erb"
copy_file "#{copy_path}/rooms/edit.html.erb", "#{paste_path}/rooms/edit.html.erb"
copy_file "#{copy_path}/rooms/index.html.erb", "#{paste_path}/rooms/index.html.erb"
copy_file "#{copy_path}/rooms/new.html.erb", "#{paste_path}/rooms/new.html.erb"
copy_file "#{copy_path}/rooms/show.html.erb", "#{paste_path}/rooms/show.html.erb"
end
private
def copy_path
'../../../../../app/views/speaker'
end
def paste_path
'app/views/speaker'
end
end
我不想写出每个文件,而是想使用 glob 方法遍历给定文件夹中的所有文件。但为了做到这一点,我首先需要进入 Rails 引擎的 views 文件夹。
所以这是我的问题。我如何从我的 Rails 应用程序 进入安装的 Rails 引擎 内的目录?
我想用这样的方法替换上面的 generate_participant_views
方法:
def generate_participant_views
Dir.chdir "#{copy_path}/participants"
all_files = Dir.blob('*')
all_files.each do |file|
copy_file file, paste_path + file
end
end
显然该方法的第一行不起作用,因为它是从 Rails app 内部调用的,而不是引擎。
那么,如何从应用程序的有利位置将目录更改为安装的 Rails 引擎内的文件夹?
谢谢!
我最终采用了不同的方法,通过复制和粘贴整个目录来解决问题。这解决了必须通过 Rails 应用程序手动访问引擎文件的问题。
更新后的方法如下:
def generate_participant_views
directory "#{copy_path}/participants", "#{paste_path}/participants"
end
def generate_room_views
directory "#{copy_path}/rooms", "#{paste_path}/rooms"
end