Я играю с Rails 5's find_or_initialize
в моем приложении для блога, в котором есть записи и категории, введенные в текстовые поля ввода.Использование find_or_initialize on Rails 5
сообщение модель
# == 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
Категория модель
# == 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 %>
Моя беда пытается получить то, что вводится в категории fields_for ввода в модель сообщение, чтобы использовать find_or_initialize
.
Я попытался следующие:
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-интерфейсом атрибутов, но кто-то заставляет его работать с проверками. Согласился на метод предиката, спасибо за это. –