首页 > 解决方案 > 如何在视图中显示模型错误?

问题描述

预期结果:我在屏幕顶部看到错误,例如存在和长度验证错误

实际结果:屏幕顶部没有错误,而我在日志中看到回滚。当我更改时:redirect_to :back, alert: @reason.errors.full_messages在创建操作中,我确实看到顶部显示错误。

情况:

items_controller

def show 
  @item = Item.find(params[:id])
  @reason = Reason.new
  @reasons = reasons_for_item(@item)
end

show.html.erb

<%= form_for(@reason, url: item_reasons_path(@item), html: { class: 'form-inline' }, remote: true) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <%= f.label "Reason to use" %>
    <%= f.text_field :body, class: 'form-control' %>
    <%= f.button 'Submit', class: "btn", id: 'reason-submit-btn' %>
  <% end %>

shared/_error_messages.html.erb

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

reasons_controller

def create
    @reason = Reason.new(reason_params)
    @reason.user = current_user
    @item = Item.find_by_id(params[:item_id])
    @reason.item_id = @item.id
    @reasons = reasons_for_item(@item)
    if @reason.save
      respond_to do |format|
        format.html { redirect_to request.referer }
        format.js
      end
    else
      redirect_to :back
    end
  end

请指教


更新 1:redirect_to我不打算实现渲染,因为它保留了模型信息。仍然没有显示错误。

更新 2: 通过将带有 error_messages 的表单添加到部分来修复它。现在,在保存失败后呈现部分内容。

标签: ruby-on-railserror-handlingviews

解决方案


当您这样做时redirect_to,它会发送单独的请求并且不存储当前状态,因此它@reason是一个没有错误的新实体。你需要做render,而不是redirect_to

def create
  @item = Item.find(params[:item_id])
  @reason = @item.reasons.build(reason_params.merge(user: current_user))
  @reasons = reasons_for_item(@item)
  if @reason.save
    respond_to do |format|
      format.html { redirect_to request.referer }
      format.js
    end
  else
    render 'items/show'
  end
end

推荐阅读