如果编辑失败,则RoR渲染错误部分

时间:2018-04-11 21:22:44

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

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

我的_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." 这可以工作,但不会显示错误,因为我希望它们在我使用错误部分时显示。

1 个答案:

答案 0 :(得分:1)

  

错误显示正确(在这种情况下最大长度为100)但我的网址   更改自:my_obj_here / 1 / edit to 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