Ruby on rails 如何使用ActionText为数据种子添加富文本?

Ruby on rails 如何使用ActionText为数据种子添加富文本?,ruby-on-rails,ruby-on-rails-6,actiontext,Ruby On Rails,Ruby On Rails 6,Actiontext,在我的模型中,我有: class Listing < ApplicationRecord ... has_rich_text :description ... end 类列表

在我的模型中,我有:

class Listing < ApplicationRecord
  ...
  has_rich_text :description
  ...
 end
类列表
在my 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=listing.new(
标题:“代码静脉”,
价格:59.99*100,
描述:“{Faker::Lorem.段落(编号:30).连接(“”)}

”, 卖方id:seller.id, 发布日期:日期(2019年9月26日), 状态::活动, esrb:“成熟” )
Listing.description变为nil,导致我的NOTNULL约束出错

我已经用pry进行了调试,并尝试了
@listing.description.body=text
@listing.description.body=ActionText::Content.new(text)
,这两种方法仍然会导致列表描述为零


这是一个仅API的项目,但我在前端react应用程序中使用Trix RTE。是否有一种特定的方法来为富文本列设置种子?

您的代码中肯定还有其他问题。如果您共享迁移和完整的列表类文件,可能更容易发现发生了什么

以下是确保正确操作的几个步骤:

  • 创建一个全新的rails应用程序(您可以稍后将其删除):
  • 创建数据库
  • 创建模型
  • 更改新创建的迁移文件以确保列不为空:
  • 现在,您应该能够登录到控制台,并创建一个新列表,其中包含以下内容:
  • 和内部控制台:

    l = Listing.new(description: "<p>Something nice</p>")
    l.save!
    Listing.first.description
    
    l=Listing.new(描述:“一些不错的东西”

    ”) l、 救命! 清单1.first.description

    正如您所看到的,这足以用富文本保存/为新列表添加种子。因此,通过添加不同的验证或回调,您可能在其他地方发生的任何事情都应该是您造成的。如果不查看整个文件,很难说ActionText将实际内容存储在一个单独的
    action\u text\u rich\u text
    表中,该表使用多态关联链接回其所连接的模型

    # 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
    
    #此迁移来自action_text(最初为20180528164100)
    类CreateActionTextTables
    ActionText的JavaScript组件(实际上是整个要点)在用户与Trix交互以创建/更新
    action\u text\u rich\u text
    表中的行时自动发送AJAX请求,甚至在保存正在创建的记录之前

    然后提交表单时,实际上是将id提交到
    action\u text\u rich\u text
    表上的行,而不是提交内容。然后,当您保存模型时,它会使用模型中的
    记录类型和
    记录id更新
    上的
    action\u-rich\u-text
    对应行。这是一个非常尴尬的解决方案,它是围绕着永远不必向模型中添加列的想法构建的


    我真的不认为在API中使用ActionText有什么意义,因为整个要点是向经典rails应用程序添加一个快速而肮脏的Trix实现。你真的应该只需要一个文本栏就能解决这个问题。特别是因为这样可以让您无需加入即可访问内容。

    还涉及到其他内容-它被称为ActionText,并将内容存储在完全不同的表中。因此,是否从数据库中删除该列?我试试看。我正在使用它,因为我仍然需要一个富文本编辑器在前端。ckeditor是我真正的选择,但内置支持听起来更好。我猜它可能与ActionStorage(一种非常类似的设计)具有相同的奇怪行为,
    #description
    将返回nil,直到您将记录保存为实际查询action_text_rich_text表(而不是属性)为止。删除:description列后,我可以通过将其保存为
    @listing.description.body=@listing.description.body=“{Faker::Lorem.unique.parations(编号:30)。join(“”)}

    )来访问测试。然后,执行
    @listing.description.body.to_plain_text
    @listing.description.body.to_trix_html
    ,问题是uuid作为主键而不是整数ID
    rails g model listing description:text
    
    class CreateListings < ActiveRecord::Migration[6.0]
      def change
        create_table :listings do |t|
          t.text :description, null: false
    
          t.timestamps
        end
      end
    end
    
    
    rake db:migrate
    
    rails c
    
    
    l = Listing.new(description: "<p>Something nice</p>")
    l.save!
    Listing.first.description
    
    # 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