在Rails生成器中使用template()强制覆盖文件?

时间:2011-10-04 00:43:37

标签: ruby-on-rails ruby generator

我有一个生成器,作为一组其他操作的一部分,需要使用一堆mixins,默认值,注释等来设置模型类。

我想使用相同的rails g model ...代码(我从我的生成器调用invoke),但问题是存在冲突,因为我的模板和模型生成器的模板正在尝试互相抨击:


$ be rails g entry_form karaoke events full_name:string group_name:string
      create  app/controllers/karaokes_controller.rb
      create  app/views/karaokes/show.html.erb
      create  app/views/karaokes/thanks.html.erb
       route  resource :karaoke
      create  app/models/karaoke_entry.rb
      invoke  active_record
      create    db/migrate/20111004004008_create_karaoke_entries.rb
    conflict    app/models/karaoke_entry.rb
  Overwrite app/models/karaoke_entry.rb?
  (enter "h" for help) [Ynaqdh]

有任何建议如何解决这个问题?

(我提出的最好的方法是将我的模型文件创建移到底部,并找到一些方法强制template / copy_file继续并覆盖文件而不会打扰用户,但我看不到任何预先存在的方法。)

2 个答案:

答案 0 :(得分:3)

一些团队头脑风暴找到了解决这个问题的方法。

您无法覆盖(据我所知),但您可以告诉模型生成器跳过已存在的文件。这有效:


# Create the model definition from a template:
template "model.rb", "app/models/#{model}.rb"

# ... Later, get Rails to create everything else:
Rails::Generators.invoke("model", ["Example", "title:string", "--skip"])

(我仍然欢迎允许template覆盖文件的方法。)

答案 1 :(得分:2)

force: trueskip: true附加到模板调用中:

template "model.rb", "app/models/#{model}.rb", force: true