gpt4 book ai didi

ruby-on-rails - 在 Rails 5 上使用 find_or_initialize

转载 作者:行者123 更新时间:2023-12-04 06:36:08 24 4
gpt4 key购买 nike

我在玩 Rails 5 的 find_or_initialize在我的博客应用程序中,在输入文本字段中输入了帖子和类别。

岗位型号

# == 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>

Post 表单如下所示:
<%= 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 中输入的内容输入到 Post 模型中以使用 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 中使用了正确的回调?
  • 我应该以某种方式在 Controller 中处理这个吗?

  • 任何关于我如何编码的提示将不胜感激。

    最佳答案

    name不是帖子模型上的方法,而是类别一上的方法。由于尚未定义类别,因此您不能真正依赖调用:self.category.name任何一个。您需要以其他形式定义名称值。现在,如果您打算使用 accepts_nested_attributes_for您应该能够完全放弃该方法,只需让数据散列包含类别名称:
    { title: 'Post Title', category: { name: 'blog' } }
    如果您不走那条路,您可能应该设置一个传统的公共(public)方法来通过向该方法传递参数来创建类别,而不是使用事件记录回调。也因为 find_or_initialize()将返回一个对象,使用谓词方法没有多大意义。 generate_category?应该变成 generate_category

    关于ruby-on-rails - 在 Rails 5 上使用 find_or_initialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38569802/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com