我正在尝试实施一项设计更改,该更改要求在页面上的多个选项卡中显示错误。
我一直在验证我的模型:(还有更多验证;这只是一个例子。)
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
但应用于实际应用时却无效?还有另一种更理智的方法吗?