ruby-on-rails - 如何在使用虚拟属性时添加错误消息

标签 ruby-on-rails ruby validation getter-setter

我的日期字段不是必填字段。我正在使用 Chronic 将用户输入字符串格式化为日期字段的有效 Rails 格式。如果 Chronic 无法解析日期,我想提出一个错误,并使用相应的错误消息和原始输入值呈现编辑 View 。目前,如果输入无效日期但 service_date 字段没有任何更新,则更新成功。

new.html.erb

<%= f.text_field :service_date_text %>

账单.rb

require 'chronic'

class Bill < ActiveRecord::Base

  def service_date_text
    service_date.try(:strftime, "%m/%d/%Y")
  end

  def service_date_text=(date)
    if date.present?
      if Chronic.parse(date)
        self.service_date = Chronic.parse(date)
      else
        self.errors.add(:service_date_text, "invalid date format hello.")
      end
    else
      self.service_date = ''
    end
  end
end

bills_controller.rb

  def update
    @bill = current_account.bills.find(params[:id])
    if @bill.update_attributes(bill_params)
      redirect_to @bill, notice: 'Bill has been successfully updated.'
    else
      render :edit
    end
  end

  private

  def bill_params
    params.require(:bill).permit(:description, :notes, :po_number, :service_date_text)
  end

最佳答案

每当您运行 valid? 时,errors 都会被清除,update_attributes 会执行此操作。

示例:

irb(main):001:0> album = Album.new
=> #<Album id: nil, name: nil, release_date: nil, rating: nil, genre_id: nil,
artist_id: nil, created_at: nil, updated_at: nil>

irb(main):004:0> album.errors.add :artist, "You've selected Justin Bieber (!!!)"
=> ["You've selected Justin Bieber (!!!)"]

irb(main):006:0> album.errors.messages
=> {:artist=>["You've selected Justin Bieber (!!!)"]}

irb(main):007:0> album.valid?
=> true

irb(main):008:0> album.errors.messages
=> {}

不要滥用 setter ,使用正确的验证。例如(未测试):

  require 'chronic'

  class Bill < ActiveRecord::Base
    validate :service_date_validation

    def service_date_text
      service_date.try(:strftime, "%m/%d/%Y")
    end

    def service_date_text=(date)
      if date.present?
        if Chronic.parse(date)
          self.service_date = Chronic.parse(date)
        else
          self.service_date = false
        end
      else
        self.service_date = ''
      end
    end


    private

      def service_date_validation
        if self.service_date == false
          self.errors.add(:service_date_text, "invalid date format hello.")
        end
      end
  end

...还有一些 gem 提供日期验证,例如:

...以及其他一些...

关于ruby-on-rails - 如何在使用虚拟属性时添加错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28002101/

相关文章:

ruby-on-rails - ruby on rails 中的类变量未初始化错误

ruby-on-rails - Rails 3 + 守护进程 gem : Exception when querying model

ruby-on-rails - 无法提取 RVM 源

ruby-on-rails - 提交文本时 Rails 4 数字验证不抛出错误

ruby-on-rails - (rails) 使用正则表达式验证 URL 帮助

ruby-on-rails - Webpacker 在 *Rails 6* 应用程序的 manifest.json 中找不到 application.css

ruby-on-rails - 如何在 Rails 中重新排序实例

ruby - SSL_connect 返回=1 错误号=0 状态=错误 : certificate verify failed in ruby and Ubuntu 14. 04

输入类型不是 "submit"时的 HTML5 验证

validation - Grails 命令对象自定义验证消息代码