Ruby 关于使用gsub有什么建议吗?在irb控制台中工作正常,但赢得';无法在实际文件中查找/替换

Ruby 关于使用gsub有什么建议吗?在irb控制台中工作正常,但赢得';无法在实际文件中查找/替换,ruby,ruby-on-rails-3,rake,gsub,Ruby,Ruby On Rails 3,Rake,Gsub,我已经有了一些webapp的基本框架(一些静态页面、用户身份验证、rpec的基本测试)。我想把它作为未来Web应用程序的基础。我把我的项目命名为“框架”,所以如果我把它分叉,我将有十几个实例,我必须用我正在创建的新应用程序的名称替换术语“框架”。该项目如下所示。自述文件包含我需要进行更改的文件列表。我可以手动进行这些更改,但我更愿意将此过程自动化。我认为最简单的方法是在框架中包含一个rake文件。因此,我创建了名为renamer.rake的rake文件。我的rake文件基于以下帖子:。这是我想到

我已经有了一些webapp的基本框架(一些静态页面、用户身份验证、rpec的基本测试)。我想把它作为未来Web应用程序的基础。我把我的项目命名为“框架”,所以如果我把它分叉,我将有十几个实例,我必须用我正在创建的新应用程序的名称替换术语“框架”。该项目如下所示。自述文件包含我需要进行更改的文件列表。我可以手动进行这些更改,但我更愿意将此过程自动化。我认为最简单的方法是在框架中包含一个rake文件。因此,我创建了名为renamer.rake的rake文件。我的rake文件基于以下帖子:。这是我想到的

task :rename do

  file_names = ['config/environments/test.rb', 'config/environments/production.rb', 
    'config/environment.rb']
  file_names.each do |file_name|
    text = File.read(file_name)
    puts text.gsub("Framework", "funktrunkgunk")
  end
end
这段代码的作用是用不同的术语替换术语“框架”,但它只在控制台中起作用。我需要它来改变文件的内容。我需要做什么?我需要打开每个文件而不是仅仅读取它吗


仅供参考,这段代码只列出了几个文件(只是为了测试这个方法是否有效),替换项最终将是一个变量,而不是“funktrunkgunk”。一旦我搞定了这个部分,我想把它安装好,这样任何人都可以将框架repo克隆到他们的机器上,将cd复制到框架目录中,启动rails服务器,然后在浏览器上转到本地主机重命名文件。我将public/index.html设置为一个基本页面,其中包含一个表单字段,用户可以在其中输入自己的应用程序名称。一旦用户单击“名称应用”按钮,它将运行rake文件。听起来可行吗?

您需要将更改后的文本再次写入文件

File.open(file_name, 'w') { |f| f << text.gsub("Framework", "funktrunkgunk") }

File.open(File_name,'w'){| f | f您的代码所做的只是在局部变量
text
中进行替换。要对物理文件进行更新,您必须打开文件并写入替换的文本。例如

task :rename do

  file_names = ['config/environments/test.rb', 'config/environments/production.rb', 
    'config/environment.rb']
  file_names.each do |file_name|
    text = File.read(file_name)
    File.open(file_name, "w") { |file| file << text.gsub("Framework", "funktrunkgunk") }
  end
end
任务:重命名do
文件名=['config/environments/test.rb','config/environments/production.rb',
'config/environment.rb']
文件名。每个do文件名|
text=File.read(文件名)

File.open(File_name,“w”){| File | File有趣的是,你能解释一下按位左移位运算符对文件的作用吗?来自1.9文档。
ios@AShelly:谢谢,搜索“1.9文档”告诉我不要使用
读取
,除非您确定文件将适合内存。如果文件大于可用内存,程序将进入爬网。而是使用逐行I/O以提高可扩展性和速度。除非您确定文件适合内存,否则不要使用
读取
。对于大容量,逐行I/O速度更快les,并且是可伸缩的。