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/edit 到 my_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 中的 new
和 edit
操作除了显示表单外什么都不做。
当您提交表单时,您会向 my_obj_here/1
发送 PATCH 请求。这是一个 non-idempotent 请求,因为它改变了资源。当验证失败并且您进行渲染时,您实际上是在显示尝试更新资源的结果。这与 my_obj_here/1/edit
的 GET 请求根本不同——它不可缓存且无法重新访问。
http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default
我遇到的问题可能很容易解决,虽然我做了很多搜索并找不到解决方案。
我有 _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/edit 到 my_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 中的 new
和 edit
操作除了显示表单外什么都不做。
当您提交表单时,您会向 my_obj_here/1
发送 PATCH 请求。这是一个 non-idempotent 请求,因为它改变了资源。当验证失败并且您进行渲染时,您实际上是在显示尝试更新资源的结果。这与 my_obj_here/1/edit
的 GET 请求根本不同——它不可缓存且无法重新访问。
http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default