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

Rails 4.2更新验证失败后URL丢失/edit后缀,需保留render方法

Rails 更新验证失败后URL丢失/edit后缀的解决方案需求

工作环境

  • Rails 4.2.4
  • Ruby 2.3.1
  • SQL Server数据库
  • 视图层使用JavaScript

问题场景

控制器中update动作代码如下:

if @cs.update_attributes(cs_params_update)
  flash[:notice] = "Centro de Saúde #{t(:record_successfully_updated)}"
  # format.html { render :action => 'edit', :cs_id => @cs.id  }
  # Permance na mesma página após o update
  format.html { redirect_to({:controller => :cs, :action=>:edit,
                              :method => :get,
                              :cs_id => @cs.id
                              })}
  format.xml { head :ok }
else
  format.html { render({:controller => :cs, :action=> :edit }) }
  format.xml { render :xml => @cs.errors, :status => :unprocessable_entity }
end

访问http://localhost:3000/cs/1/edit进行编辑,提交内容触发验证失败时,验证错误可正常显示,但URL变为http://localhost:3000/cs/1,丢失了/edit后缀。

需求限制

曾查阅相关问题,由于取消按钮会跳转到show页面,必须保留render方法,不能使用redirect,同时要解决URL丢失/edit后缀的问题。

视图相关JS代码

视图中使用以下JavaScript函数控制元素启用/禁用:

function EnablDisablElements(FieldsNames, Status){
    if (FieldsNames) {
        for (var h = 0; h < FieldsNames.length; h++) {
            document.getElementById(FieldsNames[h]).disabled = Status;
        }
    }
}

解决方案

要在保留render的前提下维持URL的/edit后缀,核心是让表单提交到edit路径而非默认的update路径,具体步骤如下:

  1. 修改表单提交目标
    在edit视图的表单中,显式指定表单提交到edit_cs_path,并设置method: :patch(更新操作需用PATCH方法):

    <%= form_for @cs, url: edit_cs_path(@cs), method: :patch do |f| %>
      <!-- 表单内容 -->
    <% end %>
    

    这样表单提交后,请求会发送到/cs/1/edit路径,即使验证失败用render :edit返回,URL也会保持不变。

  2. 调整路由配置
    在config/routes.rb中添加对应路由,让edit_cs_path能正确生成URL,并将该路径的PATCH请求映射到update动作:

    resources :cs do
      patch :edit, on: :member
    end
    

    或者直接添加单独路由:

    patch '/cs/:id/edit', to: 'cs#update', as: :edit_cs
    
  3. 保留原控制器逻辑
    维持原update动作的逻辑不变,验证失败时执行render :edit即可,此时因请求本身指向/cs/1/edit,渲染视图后URL不会改变。


内容的提问来源于stack exchange,提问作者Shyden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:35:04