【问题标题】:Rails Active Record validates_precense_of not flashing error messageRails Activerecord validates_presence_of 不闪烁错误信息
【发布时间】:2015-08-05 20:46:13
【问题描述】:

我在 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

不是请求失败并闪烁错误消息,而是请求成功,建议表中不会保存任何建议记录。

我已经调试并确认(参见下面的控制器)@suggestion.details.blank?.empty 返回 true 是文本框为空。

这是控制器动作:

  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 运算符 ! 以进行正确保存

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation model null


    【解决方案1】:

    您需要检查save 调用的结果,或者改为save! 以使请求失败:

    if @suggestion.save
      flash[:alert] = 'Your suggestion has been submitted.'
    else
      flash[:alert] = 'Your suggestion cannot be blank'
    end
    

    如果您希望在 AJAX 请求之后显示验证错误,您需要在您的 &lt;controller_name&gt;.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。

    【讨论】:

    • 看起来这也不起作用。不应该在活动记录中执行验证吗?
    • 调试并发现@suggestion.save 对于空输入为假,但控制器仍然不闪烁消息。否则,它会在加载下一页之前只闪烁一秒钟的消息。
    • 我已经确认消息正在闪烁,但下一页仍在加载中。换句话说,请求仍在进行中,并且没有记录保存到数据库中,因为我仍然有 validates_precense_of 回调
    • 那么,您目前的问题是什么?
    • 如果文本框输入为空,如何防止请求成功通过?
    猜你喜欢
    • 2013-09-22
    • 2014-10-23
    • 2018-03-10
    • 2017-03-19
    • 2010-11-15
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多