Rails 7.1中覆盖Scaffold Controller及添加视图的技术求助
自定义Rails Scaffold模板配置方案
一、覆盖Scaffold Controller模板
- 首先创建正确的模板路径:
lib/templates/rails/scaffold_controller/controller.rb - 在该文件中编写自定义Controller模板,示例代码如下(已添加
before_action :authenticate_user!):
class <%= class_name %>Controller < ApplicationController before_action :authenticate_user! before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy] # GET /<%= table_name %> # GET /<%= table_name %>.json def index @<%= plural_table_name %> = <%= class_name %>.all end # GET /<%= table_name %>/1 # GET /<%= table_name %>/1.json def show end # GET /<%= table_name %>/new def new @<%= singular_table_name %> = <%= class_name %>.new end # GET /<%= table_name %>/1/edit def edit end # POST /<%= table_name %> # POST /<%= table_name %>.json def create @<%= singular_table_name %> = <%= class_name %>.new(<%= singular_table_name %>_params) respond_to do |format| if @<%= singular_table_name %>.save format.html { redirect_to @<%= singular_table_name %>, notice: '<%= class_name %> was successfully created.' } format.json { render :show, status: :created, location: @<%= singular_table_name %> } else format.html { render :new } format.json { render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity } end end end # PATCH/PUT /<%= table_name %>/1 # PATCH/PUT /<%= table_name %>/1.json def update respond_to do |format| if @<%= singular_table_name %>.update(<%= singular_table_name %>_params) format.html { redirect_to @<%= singular_table_name %>, notice: '<%= class_name %> was successfully updated.' } format.json { render :show, status: :ok, location: @<%= singular_table_name %> } else format.html { render :edit } format.json { render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity } end end end # DELETE /<%= table_name %>/1 # DELETE /<%= table_name %>/1.json def destroy @<%= singular_table_name %>.destroy respond_to do |format| format.html { redirect_to <%= plural_table_name %>_url, notice: '<%= class_name %> was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_<%= singular_table_name %> @<%= singular_table_name %> = <%= class_name %>.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def <%= singular_table_name %>_params params.require(:<%= singular_table_name %>).permit(:name) end end
- 关键说明:
scaffold_controller是Rails识别的模板命名空间,该路径下的模板会优先于默认模板被加载。
二、添加额外Scaffold视图
1. 添加destroy.turbo_stream.haml
- 创建路径:
lib/templates/rails/scaffold/destroy.turbo_stream.haml - 编写模板内容示例:
<%= turbo_stream.remove @<%= singular_table_name %> %> <%= turbo_stream.update 'flash', partial: 'shared/flash', locals: { notice: '<%= class_name %> was successfully destroyed.' } %>
2. 添加模型局部视图_mymodel.html.haml
- 创建路径:
lib/templates/rails/scaffold/_singular.html.haml(文件名中的_singular是Rails模板变量,生成时会自动替换为模型的单数形式,比如_mymodel) - 编写模板内容示例:
.tr .td= <%= singular_table_name %>.name .td = link_to 'Show', <%= singular_table_name %>_path(<%= singular_table_name %>) = link_to 'Edit', edit_<%= singular_table_name %>_path(<%= singular_table_name %>) = link_to 'Destroy', <%= singular_table_name %>_path(<%= singular_table_name %>), method: :delete, data: { confirm: 'Are you sure?' }
注意事项
- 确保项目已安装
haml-railsgem,否则无法生成Haml格式的视图文件。 - 模板中的变量(如
<%= class_name %>、<%= singular_table_name %>)需与Rails scaffold模板变量保持一致,才能正确替换为目标模型的信息。
三、验证效果
运行rails generate scaffold MyModel name:string后,检查以下内容:
app/controllers/my_models_controller.rb中是否包含before_action :authenticate_user!app/views/my_models/目录下是否存在destroy.turbo_stream.haml和_mymodel.html.haml文件- 生成的文件内容是否与自定义模板一致
内容的提问来源于stack exchange,提问作者Ward W. Vuillemot
相关产品推荐
相关产品推荐

