在 Rails 中更改脚手架控制器生成器模板

Posted

技术标签:

【中文标题】在 Rails 中更改脚手架控制器生成器模板【英文标题】:Changing scaffold-controller-generator-templates in Rails 【发布时间】:2016-05-22 03:14:01 【问题描述】:

当我使用 Rails 脚手架生成器创建我的 Rails 文件时,它会创建一个控制器文件。例如

rails generate scaffold potato

生成:

app/controllers/potatos_controller.rb

对于我的项目,我希望这个文件更具体一点。例如。我想更改这个自动生成的动作:

def create
  @potato = Potato.new(potato_params)

  respond_to do |format|
    if @potato.save
      format.html  redirect_to @potato, notice: 'Potato was successfully created.' 
      format.json  render :show, status: :created, location: @potato 
    else
      format.html  render :new 
      format.json  render json: @potato.errors, status: :unprocessable_entity 
    end
  end
end

使用 I18n 翻译而不是硬编码 'Potato 已成功创建。' 另外我想更改一些缩进,因为 rubocop 总是抱怨它。

我找到了脚手架生成器的模板,现在想进行更改。为此,我在我的项目中创建了一个文件: lib/templates/rails/scaffold_controller/templates/controller.rb 在此文件中,我进行了更改。 (例如我换行了

redirect_to @<%= singular_table_name %>, notice: <%= "'#human_name was successfully created.'" %>

redirect_to @<%= singular_table_name %>, notice: <%= "'#human_name THIS IS A TEST.'" %>

但不幸的是,这些更改不起作用。脚手架生成器仍然使用自己的模板。那么我在这里做错了什么?我错过了一步吗?

更新: 这是生成命令的输出:

rails generate scaffold potato      

Running via Spring preloader in process 31479
  invoke  active_record
  ...

  invoke  scaffold_controller
  create    app/controllers/potatos_controller.rb
  ...

railties 的屏幕截图:

【问题讨论】:

谁解决了你的问题?我尝试使用 Mihai 的答案,但不起作用。 嘿,我也有同样的问题,我觉得那里的代码与生成的代码不一样。你有没有找到生成代码的地方? 不,我决定不在乎 【参考方案1】:

Rails 4 显示正在使用的模板

rails generate scaffold potato
...
invoke  scaffold_controller

您应该将修改后的模板托管在您的项目中,即lib/templates/rails/scaffold_controller/controller.rb

请注意,Responders gem 可能会将使用的生成器更改为lib/templates/rails/responders_controller/controller.rb

【讨论】:

感谢您的提示。我检查了生成器的输出,它调用了scaffold_controller - 我试图编辑的那个。 (查看更新的问题) 这很有趣。你也可以尝试编辑responders_controller 看看会发生什么? 我还添加了一个屏幕截图,如果我的 rails-generators 的目录结构。似乎没有responders_controller。我尝试在我的项目中创建文件,但它对结果没有任何影响。 我的错,responders_controller 是由 Responders gem 定义的(由 Devise 使用)。您应该将修改后的模板放入您的项目中,即lib/templates/rails/scaffold_controller/controller.rb 也尝试不使用spring。如果不重新启动,它可能无法加载您的模板。【参考方案2】:

如果有人觉得它有用,你可以通过在你的项目目录中运行这个命令,将默认的 railties 控制器脚手架模板复制到你自己的项目中:

mkdir -p lib/templates/rails/scaffold_controller && \
  cp $(bundle info railties --path)/lib/rails/generators/rails/scaffold_controller/templates/* \
  lib/templates/rails/scaffold_controller

如果您使用 Rails 5.2 和 jbuilder,则应使用 jbuilder 脚手架作为基础:

mkdir -p lib/templates/rails/scaffold_controller && \
  cp $(bundle info jbuilder --path)/lib/generators/rails/templates/* \
  lib/templates/rails/scaffold_controller

【讨论】:

当我使用这个方法时,它会按预期覆盖模板。但是,生成的代码与没有覆盖的代码不同。我似乎是错误的模板。原代码: 当我使用这个方法时,它会按预期覆盖模板。但是,生成的代码是不同的。原始生成的代码适用于 json 和 html 格式的响应。复制的模板仅生成 html 响应的代码。 我会尽快更新 - JSON 和 HTML 控制器模板位于 jbuilder gem 中。【参考方案3】:

要复制的模板是here,您必须按照蒂姆的回答将它放在lib/templates/rails/scaffold_controller/

【讨论】:

以上是关于在 Rails 中更改脚手架控制器生成器模板的主要内容,如果未能解决你的问题,请参考以下文章

覆盖rails 5的控制器测试脚手架

跳过 Rails 中的 JSON 格式生成脚手架

如何在 ruby​​ on rails 中更改路线?

如何避免 Rails 脚手架将模型放入命名空间

Rails 4控制器由脚手架生成的新闻无法正常工作

基本 .ajax 发布到 rails 3.2.2 脚手架,生成“警告:无法验证 CSRF 令牌真实性”