2011-12-28 14 views
2

私はRubyで新しく、コードベースを継承しました。私は次のエラーを取得しようとすると、今私は、自分のアプリケーションに新しいユーザーアカウントを作成することはできません:NilClass :ユーザーでRuby on Railsでは、ActiveRecordオブジェクトのmember_ofにどのようにデフォルト値を割り当てるのですか?

NoMethodError :: RegistrationsController位nilのため

未定義のメソッド `name」を作成しますRails.root:/ home/nathan/dev/legwork-core

アプリケーショントレース|フレームワークトレース|呼び出し元のコードはここにあるblock (2 levels) in <class:Contact>' app/models/user.rb:31:in update_contact」

に::フルトレース アプリ/モデル/ contact.rb:74

searchable do 
    string :category do 
     self.category.name 
    end 
    end 

カテゴリContactCategoryのインスタンスであることを想定している、と私は、私は必要だと思いますそのnilの場合は、デフォルトにself.categoryを設定します。そこに他の

before_create :set_defaults 

    def set_defaults 
    self.category = ContactCategory.first if self.category.nil? 
    end 

誰かがbefore_saveでこのロジックを置くことを示唆しているが、:

def after_initialize 
    self.category = ContactCategory.first if self.category.nil? 
    end 

をそして私が試した:私も試した

after_initialize :set_defaults 

    def set_defaults 
    self.category = ContactCategory.first if self.category.nil? 
    end 

:私はそれを修正するために、これを試してみましたこの論理を持っているbefore_saveは既に存在しています。そこで、最初は作成者がデフォルトを意図したものを見ました。

UPDATE:

この質問は今私が間違っているかを見ることに愚かです。 ContactCategory.firstもnilではないと仮定したため、代入文が実行されなかったと仮定していました。残念ながら、ここのすべてが期待どおりに機能しています。物語のモラルは:

私がデフォルトを設定するために使っていたすべてのフックが正しく動作していました。 ActiveRecordを使ってデフォルトを設定することをお勧めします。

+0

あなたは私たちにデータベース構造を表示できますか?テーブルを記述しますか?現在、あなたは '名前'を使用していますが、そのフィールドは存在しないようです。 –

+0

これはNoMethodErrorです。Users :: RegistrationsController#create 未定義のメソッド 'name –

+0

実際の問題は、カテゴリがnil:' undefined method 'name' for nil:NilClass'です。 – sczizzo

答えて

1

私はbefore_createコールバックを使用してデフォルト値などを設定する傾向がありますが、here's the full list of ActiveRecord callbacks from the RoR API docsです。あなたはまさにその名が示唆するようにafter_initializeが動作しない気づくでしょう:

Lastly an after_find and after_initialize callback is triggered for each object that is found and instantiated by a finder, with after_initialize being triggered after new objects are instantiated as well.

あなたはおそらく代わりにbefore_saveまたはbefore_createを使用したいです。

+0

返信ありがとう、私は評判が足りないので、私はそれをupvoteすることはできません。私はbefore_callbackを使ってみたところ、同じ結果が出ました。この論理を持つbefore_saveが既にあります。それが、最初は作成者がデフォルトを意図していたものです。 –

+0

カテゴリIDを代わりに保存する必要がありますか? 'self.category_id = 1'のようなもの? – sczizzo

+0

これについて詳しく説明できますか?テーブル内のIDを使用してContactCategoryオブジェクトを手動でロードしますか? –

0

また、マイグレーションでもデフォルトを割り当てて(フィールドがNULLにならないようにする)ことができます。 Here's an example from one of my own projects

class AddRolesMaskToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :roles_mask, :integer, :default => DEFAULT_ROLE, :null => false 
    end 
end 
関連する問題