Hash 如何强制Rails 4使用旧式哈希语法

Hash 如何强制Rails 4使用旧式哈希语法,hash,ruby-on-rails-4,hashrocket,Hash,Ruby On Rails 4,Hashrocket,我刚刚将一个旧项目升级到Rails 4,我刚刚意识到它已经使用新样式的哈希语法升级了schema.rb。我想Rails将对其所有生成器使用这种语法 友好地说,我怎么能对Rails说我更喜欢哈希的老式语法呢?schema.rb是由rake db:migrate命令创建的。据我所知,很难向Rails推荐哈希的旧式语法。但是没有什么是不可能的,您可以使用rails/activerecord/lib/active\u record/schema\u dumper.rb文件。唯一的问题是,下次升级rail

我刚刚将一个旧项目升级到Rails 4,我刚刚意识到它已经使用新样式的哈希语法升级了
schema.rb
。我想Rails将对其所有生成器使用这种语法


友好地说,我怎么能对Rails说我更喜欢哈希的老式语法呢?

schema.rb
是由
rake db:migrate
命令创建的。据我所知,很难向Rails推荐哈希的旧式语法。但是没有什么是不可能的,您可以使用
rails/activerecord/lib/active\u record/schema\u dumper.rb
文件。唯一的问题是,下次升级rails gem时,它将覆盖


哈希的这种旧式语法到新式语法的转换是在commit中完成的。

schema.rb
是由
rake db:migrate
命令创建的。据我所知,很难向Rails推荐哈希的旧式语法。但是没有什么是不可能的,您可以使用
rails/activerecord/lib/active\u record/schema\u dumper.rb
文件。唯一的问题是,下次升级rails gem时,它将覆盖


这种旧式语法到新式语法的转换是在commit中完成的。

我知道这并不能完全回答您的问题,但它可能会有所帮助

如果您使用vim,这将允许您在新旧语法()之间切换:

函数!s:RubyHashSyntaxToggle()范围
如果join(getline(a:firstline,a:lastline))=~#'=>'
安静!执行a:第一行。“,”。a:最后一行。”s/[^{,]*[{,]\?\zs:\([^::\+\)\s*=>/\1:/g'
其他的
静默!执行a:firstline.,'.a:lastline.s/[^{,]*[{,]\?\zs\([^::\+\):/:\1=>/g'
恩迪夫
端功能
命令!-bar-range RubyHashSyntaxToggle,调用s:RubyHashSyntaxToggle()
noremap rh:RubyHashSyntaxToggle
最多只需按3次键即可获得所需的模式。它不是自动的,但作为对应项,它可以在任何文件上工作,而不仅仅是在模式上

您可以在每次保存文件时调用替换(我这样做是为了删除行尾的额外空格)


如果您不使用vim,这些正则表达式可能会被其他编辑器修改。

我知道这并不是您问题的答案,但可能会有所帮助

如果您使用vim,这将允许您在新旧语法()之间切换:

function!s:RubyHashSyntaxToggle()范围
如果join(getline(a:firstline,a:lastline))=~#'=>'
静默!执行a:firstline.','.a:lastline.'s/[^{,]*[{,]\?\zs:\([^::\+\)\s*=>/\1:/g'
其他的
静默!执行a:firstline.,'.a:lastline.s/[^{,]*[{,]\?\zs\([^::\+\):/:\1=>/g'
恩迪夫
端功能
命令!-bar-range RubyHashSyntaxToggle,调用s:RubyHashSyntaxToggle()
noremap rh:RubyHashSyntaxToggle
最多只需按3次键即可获得所需的模式。它不是自动的,但作为对应项,它可以在任何文件上工作,而不仅仅是在模式上

您可以在每次保存文件时调用替换(我这样做是为了删除行尾的额外空格)


如果您不使用vim,这些正则表达式可能会被其他编辑器修改。

这是一个Ruby问题,不特定于Rails。但是,没有内置的方法来禁用短哈希语法。@diego.greyrobot为什么说“这是一个Ruby问题,不特定于Rails?”?Ruby是一种语言,Rails是一种web应用程序框架。简短的哈希语法是该语言的一个功能,而不是框架的一个功能。你用Ruby on Rails而不是Ruby标记了这个问题。你的问题问的是Rails。我只是想帮你…学究般地。@diego.greyrobot我明白了,谢谢你的澄清。但我把责任归咎于e Rails代码生成器作为这一选择的负责人,我认为“这是一个Rails问题,不特定于Ruby”;)这是一个Ruby问题,不特定于Rails。但是,没有内置的方法来禁用短哈希语法。@diego.greyrobot为什么说“这是一个Ruby问题,不特定于Rails?”?Ruby是一种语言,Rails是一种web应用程序框架。简短的哈希语法是该语言的一个功能,而不是框架的一个功能。你用Ruby on Rails而不是Ruby标记了这个问题。你的问题问的是Rails。我只是想帮你…学究般地。@diego.greyrobot我明白了,谢谢你的澄清。但我把责任归咎于e Rails代码生成器作为这一选择的负责人,我认为“这是Rails的问题,不是Ruby特有的”;)即使这不是我问题的解决方案,我认为这是正确的,悲哀的,答案:/。感谢提交的链接。即使这不是我问题的解决方案,我认为这是正确的,悲哀的,答案:/。感谢提交的链接。我担心的是,从现在开始,Rails代码生成器将为我们提供帮助对于生成的任何代码,我都希望有一个选项来告诉它:请使用旧语法:),就像我可以告诉它使用我最喜欢的测试框架一样。所以我不需要一直清理。但无论如何,感谢你的技巧。我担心的是,从现在开始,Rails代码生成器将使用这种方法对于生成的任何代码的新语法,我希望有一个选项来告诉它:请使用旧语法:),就像我可以告诉它使用我最喜欢的测试框架一样。所以我不需要一直清理。但是无论如何,谢谢你的技巧。
function! s:RubyHashSyntaxToggle() range
  if join(getline(a:firstline, a:lastline)) =~# '=>'
    silent! execute a:firstline . ',' . a:lastline . 's/[^{,]*[{,]\?\zs:\([^: ]\+\)\s*=>/\1:/g'
  else
    silent! execute a:firstline . ',' . a:lastline . 's/[^{,]*[{,]\?\zs\([^: ]\+\):/:\1 =>/g'
  endif
endfunction
command! -bar -range RubyHashSyntaxToggle <line1>,<line2>call s:RubyHashSyntaxToggle()
noremap <Leader>rh :RubyHashSyntaxToggle<CR>