0

我正在尝试实施一项设计更改,该更改要求在页面上的多个选项卡中显示错误。

我一直在验证我的模型:(还有更多验证;这只是一个例子。)

validate :has_comment? if: lambda { |r| r.last_step? && r.request_type == :snf_request }

def has_comment?
  errors[:base] << "Request must have at least one comment." if self.comments.blank?
end

这可行,但显然所有这些错误消息都附加到该errors[:base]数组中。

我试着做这样的事情:

def has_comment?
  errors[:comments_page] << "Request must have at least one comment." if self.comments.blank?
end

想到我可以为错误消息调用一个部分,然后将 a 传递symbol给它,指定它应该输出哪一页错误。

当我在 中对此进行测试时rails console,我创建了一个新的空白Request对象并检索了它的错误。键入r.errors[:base]给了我像第一个示例一样添加的验证消息,并r.errors[:comments_page]给了我在第二个示例中添加的消息。

但是,当我转到我的应用程序并实际创建一个空白请求时,这不起作用。错误消息部分呈现,但它是空白的。这是我的部分内容以及我如何渲染它以供参考。

<%= form_for @request, html: { id: "new_request_form", autocomplete: :off } do |f| %>
  <%= render 'snf/shared/error_messages', target: f.object %>

和部分:

<% if target.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-error">
      The form contains <%= pluralize(target.errors.count, "error") %>.
    </div>
    <ul>
      <% target.errors[:base].each do |msg| %>
        <li>* <%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

这是控制器动作

def update
  @request = Snf::Request.find(params[:id])
  @request.update_attributes(params[:snf_request])

  if params[:save] == "draft"
    @request.current_step = "draft"
  else
    @request.current_step = @request.steps.last
  end

  respond_to do |format|
    if @request.save
        if params[:save] == "draft"
          notice = 'snf.requests.message.draft'
        elsif is_new || is_forwarded
          notice = 'snf.requests.message.sent'
        else
          notice = 'snf.requests.message.updated'
        end

    format.html {
      flash[:notice] = I18n.t(notice)
      redirect_to snf_physician_path(current_user)
    }
    format.json {
    flash[:notice] = I18n.t(notice)
      redirect_to snf_physician_path(current_user)
    }
  else
    if params[:forwarded_consult_request]
      format.html {
        @request_types = Snf::RequestType.all
        @physicians = User.physicians_by_specialty
        render action: "forward"
      }
    else
      format.html{
        @request_types = Snf::RequestType.all
        @physicians = User.physicians_by_specialty
        render action: "edit_new"
      }
    end
  end
end

我只是target.errors[:base]在那里添加了测试。它通常读取target.errors.full_messages.

我在这里错过了什么吗?为什么这似乎有效,irb/rails console但应用于实际应用时却无效?还有另一种更理智的方法吗?

4

0 回答 0