4

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

その後、保存が機能します。

なぜこれがそうであるように振る舞うのか、誰かが光を当てることができますか?

4

1 に答える 1

6

before_saveその他のコールバックは、 が返された場合に保存を終了しますfalse。これはまさにあなたがしたことです。忘れると罠です。最後の行にいくつかtrue(または) を入れることができます:nil

def default_values
  self.islive = false
  true
end
于 2012-10-14T17:49:34.443 に答える