You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-rails gem,否则无法生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:01:01