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

4

我正在使用Rails 3.2.8版本编写一个简单的博客应用程序。我已经按照以下方式创建了“posts”资源:

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 transactionrollback 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个回答

6

before_save以及其他回调函数如果返回false,那么保存操作就会终止。这正是您所做的。如果您忘记了这一点,它就像一个陷阱。您可以在最后一行放置一些true(甚至是nil):

def default_values
  self.islive = false
  true
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接