1

すべての投稿にはカテゴリが 1 つしかなく、次のような方法でカテゴリの名前にアクセスする必要があります

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

スキーマ.rb

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

2 に答える 2

4

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

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

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

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

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

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
于 2012-05-11T21:24:59.530 に答える
1

問題は、カテゴリ レコードが存在しない場合に明示的に作成する必要があることです。

category_name=この問題を解決するには、Post でメソッドを作成することを考えます。

category_name=セッターは「デメテルの法則」の問題も処理ます

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ドキュメントの「Association Extensions」も参照してください。

于 2012-05-11T21:27:28.410 に答える