RoR 如果编辑失败则呈现部分错误

RoR Render errors partial if edit fails

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

我有 _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 %>

然后在控制器中update/create(以更新为例):

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

尝试更新时出现问题,提交信息无效,属于"render 'edit'"

错误显示正确(在本例中最大长度为 100)但我的 url 更改为: my_obj_here/1/editmy_obj_here/1

这不应该发生。

所以接下来我尝试用 "redirect_to :back" 替换 "render 'edit'" 但这只是忽略了 <%= render 'layouts/errors', obj: @my_obj_here %> 在 edit.html.erb.

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

此外,在我的更新方法中,您可能注意到了这一点 "if true": redirect_to my_path_here_path(@my_obj_here), notice: "Something." 我也可以这样做,只需将我的代码更改为: redirect_to :back, :notice => "something." 这会起作用,但不会显示错误,因为我希望它们在使用我的部分错误时显示。

The errors show correctly (in this case max length 100) but my url changes from: my_obj_here/1/edit to my_obj_here/1 which should not happen.

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

当您单击编辑 link 时,您正在对 my_obj_here/1/edit 执行 GET 请求。这是一个幂等操作——结果总是相同的,它不会改变任何资源。实际上 Rails 中的 newedit 操作除了显示表单外什么都不做。

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

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