在控制器的更新操作中,当update_attributes由于验证器而失败时,我的 URL 中会丢失 /edit 后缀

In my controller's update action, when update_attributes fails due to the validator, I lose the /edit suffix in my URL

提问人:Shyden 提问时间:9/29/2023 最后编辑:smathyShyden 更新时间:9/30/2023 访问量:60

问:

我的工作环境描述:Rails 4.2.4、Ruby 2.3.1、SQL Server 数据库、object html views 上的 javascript

我的控制器包含更新操作:

      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 后缀

我之前在一些stackoverflow问题中看到过这个问题->

如何使渲染 :edit 调用在地址栏中显示 /edit

为什么验证失败后 URL 会丢失“/edit”后缀?

就我而言,我需要使用 :render,因为我的取消按钮由于 url 而将我发送到节目,而我无法进入节目,我需要在单击取消按钮后留在编辑中。

在我看来,我使用允许您启用和禁用元素的javascript,请遵循我的应用程序.js中存在的代码:

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

评论

0赞 smathy 9/29/2023
在您的问题中,您大部分时间都专注于编辑将表单提交到其他 URL 的事实(因此您“丢失了后缀”),但您共享的链接准确地解释了为什么会发生这种情况,以及解决方法。然后你扔一些明显不相关的JS,允许你启用/禁用元素。投票结束。/edit

答:

0赞 Les Nightingill 9/30/2023 #1

它的行为是正确的。我认为您将 url 与 url 混淆了。它们是相同的,但它们具有不同的 HTTP 谓词。这是为了更新。showupdateGETshowPATCH

当验证失败时,您将处于控制器中的 #update 方法中,但验证失败后,您呈现视图。这就是这段代码的作用。实际上,您可以将其缩写为 .editformat.html { render({:controller => :cs, :action=> :edit }) }render :edit

一切都在按应有的方式进行!

0赞 max 9/30/2023 #2

你正在成为 Rails 中一个常见的初学者挂断的受害者。你的应用实际上运行正常,但你期望得到错误的结果。

假设您有一个名为 的资源。products

在 Rails 中,动作只是渲染一个表单。这是一个幂等操作GET /products/1/edit

当您提交表单时,您发送的表格不带后缀。这是因为在REST中,你使用HTTP方法来传达正在发生的事情。不是 URL 上的后缀。PATCH /products/1

然后,当您重新呈现带有错误的表单时,将显示执行非幂等操作的结果。您正在响应表单提交,并且该响应仅针对该请求。

这与不应具有相同的 URL 不是一回事。GET /products/1/edit

看: