2

在我的模型中,我有:

class Listing < ApplicationRecord
  ...
  has_rich_text :description
  ...
 end

在我的seeds.rb 中:

@listing = Listing.new(
      title: 'CODE VEIN',
      price: 59.99 * 100,
      description:  "<p>#{Faker::Lorem.paragraphs(number: 30).join(' ')}</p>",
      seller_id: seller.id,
      release_date: Date.parse('Sep 26, 2019'),
      status: :active,
      esrb: 'MATURE'
    )

Listing.description 出现为零,导致我的 NOT NULL 约束出错。

我已经用 pry 进行了调试,并尝试了@listing.description.body= textor @listing.description.body = ActionText::Content.new(text),两者仍然导致listing#description 为零。

这是一个仅限 API 的项目,但我在前端反应应用程序中使用 Trix RTE。是否有特定的方法来播种rich_text 列?

4

3 回答 3

1

ActionText 将实际内容存储在一个单独的action_text_rich_texts表中,该表使用多态关联链接回它所附加的模型。

# This migration comes from action_text (originally 20180528164100)
class CreateActionTextTables < ActiveRecord::Migration[6.0]
  def change
    create_table :action_text_rich_texts do |t|
      t.string     :name, null: false
      t.text       :body, size: :long
      t.references :record, null: false, polymorphic: true, index: false

      t.timestamps

      t.index [ :record_type, :record_id, :name ], name: "index_action_text_rich_texts_uniqueness", unique: true
    end
  end
end

当用户与 Trix 交互以创建/更新action_text_rich_texts表中的行时,即使在您保存正在创建的记录之前,ActionText 的 JavaScript 组件(这确实是重点)也会自动发送 AJAX 请求。

然后,当您提交表单时,您实际上是将 id 提交到action_text_rich_texts表上的行而不是内容。然后,当您保存模型时,它会使用模型action_text_rich_texts 中的record_typeand更新相应的行record_id。这是一个非常尴尬的解决方案,它建立在永远不必向模型中添加列的想法之上。

我真的不明白在 API 中使用 ActionText 的意义,因为重点是为经典的 Rails 应用程序添加一个快速而肮脏的 Trix 实现。你真的应该能够只用一个文本列来解决这个问题。特别是因为这将使您无需加入即可访问内容。

于 2020-10-06T13:10:16.583 回答
1

您的代码肯定还有其他问题。也许如果您分享您的迁移和完整的清单类文件,可能会更容易发现发生了什么。

这里有几个步骤来确保你做对了:

  1. 创建一个全新的 Rails 应用程序(您可以稍后将其删除):
rails new testrichtext -d mysql --api
  1. 创建数据库
cd testrichclient
rake db:create
  1. 创建模型
rails g model listing description:text
  1. 更改新创建的迁移文件以确保该列不为空:
class CreateListings < ActiveRecord::Migration[6.0]
  def change
    create_table :listings do |t|
      t.text :description, null: false

      t.timestamps
    end
  end
end

  1. 运行迁移
rake db:migrate
  1. 现在您应该能够登录到控制台,并创建一个新的列表,其中包含以下内容:
rails c

在控制台内部:

l = Listing.new(description: "<p>Something nice</p>")
l.save!
Listing.first.description

如您所见,这足以保存/播种带有富文本的新列表。因此,通过添加不同的验证或回调,您可能正在发生的任何事情都应该是您在其他地方引起的。不看整个文件很难说

于 2020-10-06T13:04:28.707 回答
0

我发现这对我有用:

15.times do
  Post.create!(title: Faker::Book.unique.title)
end

然后

Post.all.each do |post|
  ActionText::RichText.create!(record_type: 'Post', record_id: post.id, name: 'content', body: Faker::Lorem.sentence)
end

读书:

Post.first.content.body.to_plain_text 

或者:

Post.first.content.body.to_trix_html

...如 OP 所述。

来源: https ://linuxtut.com/rails6-input-the-initial-data-of-actiontext-using-seed-9b4f2/

于 2022-03-02T13:50:36.937 回答