我遇到的问题可能很容易解决,虽然我做了很多搜索但无法找到解决方案。
我的_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
当我尝试更新并且提交信息无效时会出现问题,这将落入&#34;渲染&#39;编辑&#39;&#34;
错误显示正确(在这种情况下最大长度为100)但我的网址更改为: my_obj_here / 1 /编辑至 my_obj_here / 1
这不应该发生。
接下来我尝试更换&#34;渲染&#39;编辑&#39;&#34;与"redirect_to :back"
但这只是忽略了
edit.html.erb中的<%= render 'layouts/errors', obj: @my_obj_here %>
。
有人可以帮我弄清楚如何渲染相同的 my_obj_here / 1 / edit 吗? 我相信我需要使用&#34;渲染&#34;我的方法,因为重定向只会跳过部分错误。
另外,在我的更新方法中你可能注意到这个&#34;如果是真的&#34;:
redirect_to my_path_here_path(@my_obj_here), notice: "Something."
我可以一样,只需将我的代码更改为:
redirect_to :back, :notice => "something."
这可以工作,但不会显示错误,因为我希望它们在我使用错误部分时显示。
答案 0 :(得分:1)
错误显示正确(在这种情况下最大长度为100)但我的网址 更改自:my_obj_here / 1 / edit to my_obj_here / 1,不应该 发生。
这是一种非常常见的误解。 Rails使用RESTful约定,其中使用的HTTP方法非常重要。
当您点击修改链接时,您就会向my_obj_here/1/edit
执行GET请求。这是一个幂等行为 - 结果始终相同,并且不会改变任何资源。实际上,Rails中的new
和edit
操作除了显示表单之外什么都不做。
当您提交表单时,您向my_obj_here/1
发送PATCH请求。这是一个非幂等请求,因为它会改变资源。当验证失败并且您呈现实际显示尝试更新资源的结果时。这与my_obj_here/1/edit
的GET请求根本不同 - 它不可缓存,无法重新访问。
http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default