2012-05-11 6 views
1

すべてのポストが一つだけのカテゴリを持っており、私が好きなもので、カテゴリの名前にアクセスする必要がRailsのDB関係:Post.category.name =? (未定義のメソッド `名前 ')

p = Post.new 
p.category.name = "tech" 
p.save 

それをどのように行うには?


class Category < ActiveRecord::Base 
     has_many :posts, :dependent => :destroy 

     attr_accessible :name, :image 

    end 

Post.rb

class Post < ActiveRecord::Base 
    belongs_to :category 

    attr_accessible :category_id, :name, :text, :lang, :image 

end 

Schema.rb

create_table "categories", :force => true do |t| 
    t.string "name" 
    t.string "image" 
    end 
+0

'Category'のdbフィールド' name'があるとしますか? – pduersteler

+0

@pdsuersteler:yes – sparkle

+0

ahh ..愚かな私... – pduersteler

答えて

4

あなたの例では、問題が含まれています。

p = Post.new 
p.category.name = "tech" 
p.save 

まず、新しい投稿を作成します。次に、ポストのカテゴリに名前を割り当てたいが、割り当てられたカテゴリはない。この結果、post.nil.nameのような呼び出しが発生します。nilが割り当てられている場合はカテゴリオブジェクトになりますが、そうではありません。 nilにはメソッドnameがないので、説明したエラーundefined method name for nil classが返されます。

これを解決するには、まず作業するカテゴリを割り当てる必要があります。

p.category = Category.firstまたはp.category_id = 1。その後、p.categoryはカテゴリオブジェクトを返します。したがって、ではなくカテゴリオブジェクトに対して呼び出されるため、p.category.nameが有効です。

TL; DRは:

p = Post.new 
p.category # => nil 
p.category.name # throws an error 

p.category = Category.first 
p.category # => <#Category ...> 
p.category.name # => 'actual name of category' 
p.category.name = 'foo' # works now 
1

問題は、それが存在しない場合は、明示的にカテゴリレコードを構築したい/必要があるということです。この問題を解決するために

、私はポストcategory_name=メソッドの作成について思うだろう:

category_name= settorも"law of Demeter"問題

class Post < ActiveRecord::Base 
    belongs_to :category 

    attr_accessible :category_id, :name, :text, :lang, :image 

    attr_accessible :category_name=, :category_name 

    def category_name=(name) 
    self.category = Category.find_or_create_by_name(name) 
    end 

    def category_name 
    category && category.name 
    end 

エンド

も参照の世話をするだろうこれを行う別の方法については、ActiveRecord文書の「関連付け拡張機能」を参照してください。

+0

Railsにはネイティブメソッドがありません。 – sparkle

+0

はい、あなたは ':belongs_to:category'を定義していますので、これに対してセッターとゲッターを取得します。 '.build'は自動保存されません。カテゴリは' Post'コレクションに割り当てられます。 – pduersteler

+0

しかし、最初のnilの場合は、デフォルトのセッターではカバーされません。それはすべての問題です! –

関連する問題