【问题标题】:RoR Render errors partial if edit fails如果编辑失败,则 RoR 呈现部分错误
【发布时间】:2018-09-21 21:43:50
【问题描述】:

我遇到的问题可能很容易解决,虽然我做了很多搜索并没有找到解决方案。

我的 _errors.html.erb 中有

<% if obj.errors.any? %>
 <div class="row">
  <div class="col-md-8 col-md-offset-2 col-xs-12">
   <div class="panel panel-danger">
    <div class="panel-heading">
      <h2 class="panel-title">
        <%= pluralize(obj.errors.count, "error") %>
        prohibided this form from being saved:
      </h2>
      <div class="panel-body">
        <ul>
          <% obj.errors.full_messages.each do |msg| %>
           <li><%= msg %></li>
          <% end %>
        </ul>
      </div>
    </div>
   </div>
  </div>
 </div>
<% end %>

然后我的 edit.html.erb 中有一个表单,并且:

<%= render 'layouts/errors', obj: @my_obj_here %>

然后在控制器中更新/创建(让我们以更新为例):

def update
    if @my_obj_here.update(params[:my_obj_here].permit(:body))
        redirect_to my_path_here_path(@my_obj_here), notice: "Something."
    else
        render 'edit'
    end
 end

当我尝试更新并且提交信息无效时出现问题,这将属于“渲染'编辑'”

错误显示正确(在这种情况下最大长度为 100),但我的网址更改为: my_obj_here/1/editmy_obj_here/1

这不应该发生。

接下来我尝试用"redirect_to :back" 替换“render 'edit'”,但这只是忽略了 &lt;%= render 'layouts/errors', obj: @my_obj_here %&gt; 在edit.html.erb中。

谁能帮我弄清楚如何渲染相同的my_obj_here/1/edit? 我相信我需要使用“渲染”我的方法,因为重定向只会跳过部分错误。

另外,在我的更新方法中,您可能注意到了“如果为真”: redirect_to my_path_here_path(@my_obj_here), notice: "Something." 我也可以这样做,只需将我的代码更改为: redirect_to :back, :notice =&gt; "something." 这会起作用,但不会像我希望它们在使用我的错误部分时显示的那样显示错误。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    错误显示正确(在这种情况下最大长度为 100),但我的网址 从: my_obj_here/1/edit 更改为 my_obj_here/1 不应该 发生。

    这是一个非常普遍的误解。 Rails 使用 RESTful 约定,其中使用的 HTTP 方法非常重要。

    当您单击编辑链接时,您正在向my_obj_here/1/edit 执行 GET 请求。这是一个幂等操作 - 结果始终相同,并且不会改变任何资源。事实上,Rails 中的 newedit 操作除了显示表单之外什么都不做。

    当您提交表单时,您将向 my_obj_here/1 发送 PATCH 请求。这是一个非幂等请求,因为它会更改资源。当验证失败并且您渲染时,您实际上是在显示尝试更新资源的结果。这与对my_obj_here/1/edit 的 GET 请求根本不同——它不可缓存且无法重新访问。

    http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default

    【讨论】:

    • 看起来正确,感谢您的回复。我检查了其他应用程序并且都做同样的事情,在错误之后 url 更改并丢失 /edit。所以现在有另一个问题,曾经在这里:my_obj_here/1 我需要在显示页面中拥有什么以确保在刷新后保持相同的编辑?示例:1 - 我们在这里:my_obj_here/1/edit 2 - 我们强制出错,然后我们转到 my_obj_here/1 并显示错误消息 3 - 刷新页面现在是“显示”而不是“编辑”。
    • 你没有。刷新页面会执行一个完全不同的GET my_obj_here/1 请求。这是一个幂等请求,无论状态如何,都应该提供相同的结果。这实际上并没有你想象的那么严重。我会鼓励你保持开放的心态,专注于为什么 REST 是这样构建的,而不是你认为它应该如何工作。
    • 如果您真的希望用户不丢失状态,则可以使用 javascript 设置 window.onunload 处理程序。 developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/…
    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-06-07
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多