Rails在模型中设置默认布尔值

时间:2012-10-14 17:35:37

标签: ruby-on-rails ruby ruby-on-rails-3 boolean default

我正在使用Rails 3.2.8版编写一个简单的博客应用程序。我已将“帖子”资源搭建如下:

rails g scaffold post title:string body:string islive:boolean

我希望默认情况下将islive设置为false,我试图在我的模型中这样做。我还决定不希望它可用于大规模分配,所以我按照以下方式编写了我的模型:

class Post < ActiveRecord::Base
  attr_accessible :body,  :title

  before_save :default_values

  def default_values
    self.islive = false
  end
end

我还从表单中删除了islive字段。问题是当我尝试使用上面的模型创建一个新帖子时,它不会保存。控制台看起来像这样:

Started POST "/posts" for 127.0.0.1 at 2012-10-14 18:23:30 +0100
Processing by PostsController#create as HTML
  Parameters: {"utf8"=>"✓",
"authenticity_token"=>"/lNa21JBeBz/H2cYLqAsF8uWr1frLV88WsOVKzOqwb4=", "post"=>
 {"title"=>"sample title", "body"=>"the body"}, "commit"=>"Create Post"}
(0.1ms)  begin transaction
(0.0ms)  rollback transaction
Rendered posts/_form.html.erb (1.8ms)
Rendered posts/new.html.erb within layouts/application (2.5ms)
Completed 200 OK in 29ms (Views: 26.3ms | ActiveRecord: 0.1ms)

没有任何东西得救。我只是得到begin transaction rollback transaction但是,如果我将default_values更改为:

def default_values
    self.islive = 'false'
end

一切正常,保存得很好,falsey值为islive。即使我只做这样的事情:

def default_values
    self.islive = false
    Rails.logger.debug self.islive
end

然后保存工作。

有人可以解释为什么会这样做吗?

1 个答案:

答案 0 :(得分:6)

before_save和其他回调如果返回false则会终止保存。这正是你所做的。如果你忘记它,这是一个陷阱。您可以在最后一行添加一些true(甚至nil):

def default_values
  self.islive = false
  true
end