Ruby on rails RubyonRails:在验证之前

Ruby on rails RubyonRails:在验证之前,ruby-on-rails,Ruby On Rails,在domainpost.rb中,我有: class Domainpost < ActiveRecord::Base attr_accessible :content, :additiona, :registerdate, :expiredate, :registerin, :price belongs_to :user before_save { |domainpost| domainpost.content = content.downcase } before_

在domainpost.rb中,我有:

class Domainpost < ActiveRecord::Base
  attr_accessible :content,  :additiona, :registerdate, :expiredate, :registerin, :price 

  belongs_to :user
  before_save { |domainpost| domainpost.content = content.downcase }

  before_validation :pricecheck

  validates :price, allow_blank: false, presence: true

  default_scope order: 'domainposts.created_at DESC'

  def pricecheck
    if  price.blank?
    price = 'no price'
  end
end
classdomainpost
这是行不通的 当保存后post中的价格仍然为空时,
知道我做错了什么吗?

它不起作用,因为您没有设置
Domainpost
实例的属性
price
,而是设置了一个局部变量。相反,你应该:

def pricecheck
  self.price = 'no price' if price.blank?
end

正如@Merek Lipka和@muttonlamb的回答,您可以尝试这些方法,但我建议在数据库端定义一个
默认值

就像在迁移价格字段中一样,只需执行以下操作

t.[price_data_type],:price,:default => "Your Default value"

好的,这将照顾到您的签入模型,我相信

也许您的价格有数字格式,因此字符串不能保存在那里?@user2531122是一个本地变量,不需要显式地输入“self”,因为在这种情况下,price='no price'和self.price='no price'是相等的。在pricecheck方法中,self指向正在创建/更新的对象,因此不需要self。你错了。当您使用setter方法时,有必要显式地指向消息的接收者。否则,将只设置局部变量。看看这个例子:
price='no price'
price\35;=>'no price'
self.price\35;=>nil