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路径,具体步骤如下:
修改表单提交目标
在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也会保持不变。调整路由配置
在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保留原控制器逻辑
维持原update动作的逻辑不变,验证失败时执行render :edit即可,此时因请求本身指向/cs/1/edit,渲染视图后URL不会改变。
内容的提问来源于stack exchange,提问作者Shyden
相关产品推荐
相关产品推荐

