【问题标题】:How can I show the model errors in the view?如何在视图中显示模型错误?
【发布时间】:2018-05-09 10:03:33
【问题描述】:

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

实际结果: 屏幕顶部没有错误,而我在日志中看到回滚。当我在创建操作中更改: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 的表单添加到部分来修复它。现在,在保存失败后会呈现部分内容。

【问题讨论】:

  • 顺便说一句,您可以使用@reason = @item.reasons.build(reason_params) 而不是单独创建@reason 并将item_id 分配给它

标签: ruby-on-rails error-handling views


【解决方案1】:

当您执行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

【讨论】:

  • 它将呈现reasons/show,而不是items/show。使用render 'items/show'
  • 是的,你是对的。没考虑到是reasons_controller
  • @reason = @item.reasons.build(reason_params.merge(user: current_user)) 有效。将redirect_to 更改为render 也可以。但错误不显示。
  • 您是否尝试使用@reason 而不是f.object?并尝试将object 部分重命名为reason。因为它可能与某些方法或吸气剂发生冲突。不确定,但认为它看起来会更好,并且您会避免名称冲突的可能性
  • 我修复了它,如更新 2 中所示,我重新渲染了一个部分并将信息添加到该部分显示了错误。感谢您的支持
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多