ブログアプリケーションで、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>
私の質問は:
- 私はカテゴリにアクセスするにはどうすればよいです属性 - モデル内の
nested_attributes
にアクセスする方法はありますか? - 正しいコールバックを使用していますか
before_save
- 何とかコントローラでこれを処理する必要がありますか?
私がこれをどのようにコードすることができるかについてのヒントは非常に高く評価されます。
になるはずありがとうagmcleod。属性APIを使って実装する方法を見つけてみましょう。しかし、誰かがバリデーションを行うようにしています。述語メソッドのおかげでそれに頭を下げることに同意した。 –