Rails Active Record validates_precense_of 不闪烁错误消息
Rails Active Record validates_precense_of not flashing error message
我在 rails 应用程序中有一个文本框,我想在保存到数据库之前验证输入的伪装。因此,我尝试在正确的模型中放置一个 validates_precense_of 回调(如下所示)。
class Suggestion < ActiveRecord::Base
attr_accessible :details, :metadata, :suggestible, :user
belongs_to :suggestable, polymorphic: true
belongs_to :user
serialize :metadata, JSON
validates_presence_of :details
end
请求成功,而不是请求失败并闪烁错误消息,并且没有建议记录保存在建议中 table。
我已经调试并确认(见下面的控制器)@suggestion.details.blank?
和 .empty
return 是的,文本框是空的。
控制器动作如下:
def select_patients
@rx_search_request = RxSearchRequest.find(params[:id])
@groups = []
params['selected_patient_group'].each do |id, selected|
@groups << id if selected == "true"
end
unless @groups.blank?
@rx_search_request.select_multiple_patient_group_ids(@groups)
unless @rx_search_request.approval_status_reason_patients_and_approval? ||
@rx_search_request.approval_status_reason_requires_approval?
@rx_search_request.needs_consolidation!
# @rx_search_request.approve! approved_by: current_user
@redirect_url = rx_search_request_path(@rx_search_request)
# @message = "Request has been created."
else
@message = "Request has been forwarded to your admin for approval."
end
end
if params.keys.include? "suggestion"
#we are submitting a suggestion
group_ids = params[:selected_patient_group].collect{|k,v| k if v == 'true'}.compact
metadata = {
group_ids:group_ids,
patient_ids:ManualConsolidationPatientGroup.find(group_ids).collect{|g| g.manual_consolidation_patients}.flatten.collect{|_p| _p.id}
}
@suggestion = @rx_search_request.suggestions.new({
details:params[:suggestion_box],
metadata: metadata
})
@suggestion.user = current_user
@suggestion.save
# @message = "Your suggestion has been submitted."
# debugger
# flash[:alert] = 'Your suggestion cannot be blank' if @suggestion.details.empty?
flash[:alert] = 'Your suggestion has been submitted.'
end
respond_to do |format|
format.js
end
end
将控制器更改为此
unless @suggestion.details.blank?
flash[:alert] = 'Your suggestion has been submitted.'
else
flash[:alert] = 'Your suggestion cannot be blank'
end
#debugger
@suggestion.save!
也试过这个
if @suggestion.save!
flash[:alert] = 'Your suggestion has been submitted.'
else
flash[:alert] = 'Your suggestion cannot be blank'
end
解决方案
添加了 bang 运算符 !
以进行正确保存
您需要检查 save
调用的结果,或者使其成为 save!
而不是请求失败:
if @suggestion.save
flash[:alert] = 'Your suggestion has been submitted.'
else
flash[:alert] = 'Your suggestion cannot be blank'
end
如果您希望在 AJAX 请求后显示验证错误,您需要在 <controller_name>.js.erb
文件中添加如下内容:
<% flash.each do |type, message| %>
$("#your_element_id").html("<%= type.to_s.humanize %>: <%= message.html_safe %>")
<% end %>
...您应该在其中将 #your_element_id
更改为您呈现 flash 消息的页面上元素的实际 HTML ID。
我在 rails 应用程序中有一个文本框,我想在保存到数据库之前验证输入的伪装。因此,我尝试在正确的模型中放置一个 validates_precense_of 回调(如下所示)。
class Suggestion < ActiveRecord::Base
attr_accessible :details, :metadata, :suggestible, :user
belongs_to :suggestable, polymorphic: true
belongs_to :user
serialize :metadata, JSON
validates_presence_of :details
end
请求成功,而不是请求失败并闪烁错误消息,并且没有建议记录保存在建议中 table。
我已经调试并确认(见下面的控制器)@suggestion.details.blank?
和 .empty
return 是的,文本框是空的。
控制器动作如下:
def select_patients
@rx_search_request = RxSearchRequest.find(params[:id])
@groups = []
params['selected_patient_group'].each do |id, selected|
@groups << id if selected == "true"
end
unless @groups.blank?
@rx_search_request.select_multiple_patient_group_ids(@groups)
unless @rx_search_request.approval_status_reason_patients_and_approval? ||
@rx_search_request.approval_status_reason_requires_approval?
@rx_search_request.needs_consolidation!
# @rx_search_request.approve! approved_by: current_user
@redirect_url = rx_search_request_path(@rx_search_request)
# @message = "Request has been created."
else
@message = "Request has been forwarded to your admin for approval."
end
end
if params.keys.include? "suggestion"
#we are submitting a suggestion
group_ids = params[:selected_patient_group].collect{|k,v| k if v == 'true'}.compact
metadata = {
group_ids:group_ids,
patient_ids:ManualConsolidationPatientGroup.find(group_ids).collect{|g| g.manual_consolidation_patients}.flatten.collect{|_p| _p.id}
}
@suggestion = @rx_search_request.suggestions.new({
details:params[:suggestion_box],
metadata: metadata
})
@suggestion.user = current_user
@suggestion.save
# @message = "Your suggestion has been submitted."
# debugger
# flash[:alert] = 'Your suggestion cannot be blank' if @suggestion.details.empty?
flash[:alert] = 'Your suggestion has been submitted.'
end
respond_to do |format|
format.js
end
end
将控制器更改为此
unless @suggestion.details.blank?
flash[:alert] = 'Your suggestion has been submitted.'
else
flash[:alert] = 'Your suggestion cannot be blank'
end
#debugger
@suggestion.save!
也试过这个
if @suggestion.save!
flash[:alert] = 'Your suggestion has been submitted.'
else
flash[:alert] = 'Your suggestion cannot be blank'
end
解决方案
添加了 bang 运算符 !
以进行正确保存
您需要检查 save
调用的结果,或者使其成为 save!
而不是请求失败:
if @suggestion.save
flash[:alert] = 'Your suggestion has been submitted.'
else
flash[:alert] = 'Your suggestion cannot be blank'
end
如果您希望在 AJAX 请求后显示验证错误,您需要在 <controller_name>.js.erb
文件中添加如下内容:
<% flash.each do |type, message| %>
$("#your_element_id").html("<%= type.to_s.humanize %>: <%= message.html_safe %>")
<% end %>
...您应该在其中将 #your_element_id
更改为您呈现 flash 消息的页面上元素的实际 HTML ID。