1

ブログアプリケーションで、Rails 5のfind_or_initializeと入力欄に投稿とカテゴリを入力して遊んでいます。Rails 5でのfind_or_initializeの使用5

Postモデル

# == Schema Information 
# 
# Table name: posts 
# 
# id   :integer   not null, primary key 
# title  :string   default(""), not null 
# body   :text    default(""), not null 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# category_id :integer 


class Post < ApplicationRecord 
    validates :title, :body, :category, presence: true 

    has_one :category 
    accepts_nested_attributes_for :category 
end 

私が得ることができるコンソールでCategoryモデル

# == Schema Information 
# 
# Table name: category 
# 
# id   :integer   not null, primary key 
# name  :string   default(""), not null 
# created_at :datetime   not null 
# updated_at :datetime   not null 

class Category < ApplicationRecord 
    validates :name, presence: true 
    validates :name, length: { in: 3..80 } 

    has_many :posts 
end 

作業するには、次

post = Post.new(title: "Hello Stack Overflow", body: "How are you today?") 
post.category = Category.find_or_initialize_by(name: "Greetings") 
post.save 

post.last 
=> #<Post:0x007fd34fa21a23 
id: 42, 
title: "Hello Stack Overflow", 
body: "How are you today?", 
created_at: Mon, 25 Jul 2016 12:56:39 UTC +00:00, 
updated_at: Mon, 25 Jul 2016 12:56:39 UTC +00:00, 
category_id: 3> 

ポストフォームはこのようになります:

<%= form_for @post do |f| %> 
    <fieldset> 
    <%= f.label "Title" %> 
    <%= f.text_field :body %> 
    </fieldset> 

    <fieldset> 
    <%= f.fields_for :category do |category_fields| 
     <%= f.label "Category" %> 
     <%= category_fields.text_field :name %> 
    <% end %> 
    </fieldset> 
<% end %> 

私の悩みはfind_or_initializeを使用するためにPostモデルに入力fields_forカテゴリに入力されたものを取得しようとしています。

私は次のことを試してみました:

class Post < ApplicationRecord 
    before_save :generate_category? 

    has_one :category 
    accepts_nested_attributes_for :category 

    private 

    def generate_category? 
    self.category = Category.find_or_initialize_by(name: name) 
    end 
end 

これが失敗したと私はNameErrorエラーを取得しています:

NameError in PostController#create 
undefined local variable or method `name' for #<Listing:0x007fc3d9b48a48> 

私の質問は:

  1. 私はカテゴリにアクセスするにはどうすればよいです属性 - モデル内のnested_attributesにアクセスする方法はありますか?
  2. 正しいコールバックを使用していますかbefore_save
  3. 何とかコントローラでこれを処理する必要がありますか?

私がこれをどのようにコードすることができるかについてのヒントは非常に高く評価されます。

答えて

0

nameは、ポストモデルではなくカテゴリ1の方法です。カテゴリはまだ定義されていないので、実際にはself.category.nameのいずれかに頼ることはできません。名前の値を他の形式で定義する必要があります。あなたは、あなたがそのルートをつもりはない場合

{ title: 'Post Title', category: { name: 'blog' } }

:あなたはaccepts_nested_attributes_forを使用することを計画している場合今、あなたは完全にその方法を見送ると、データはカテゴリ名が含まれているだけのハッシュを持つことができるはずですアクティブなレコードコールバックを使用する代わりに、このメソッドに引数を渡してカテゴリを作成する従来のパブリックメソッドをセットアップする必要があります。また、find_or_initialize()はオブジェクトを返すので、述語メソッドを使用することは意味をなさない。 generate_category?generate_category

+0

になるはずありがとうagmcleod。属性APIを使って実装する方法を見つけてみましょう。しかし、誰かがバリデーションを行うようにしています。述語メソッドのおかげでそれに頭を下げることに同意した。 –