在 Ckeditor::Picture 和 Ruby 中的模型之间创建关联的正确方法 Rails?

The proper way of creating association between Ckeditor::Picture and a model in Ruby on Rails?

我安装了 Article 模型和 Ckeditor + Paperclip。当我将图片上传到文章正文时,一切正常。但是,我想通过@article.pictures 访问这些图片,而无需创建单独的图片模型。我已经在 Article 和 Ckeditor::Picture 之间创建了一个常规关联。但是当我上传图片时,Ckeditor 毫不奇怪地需要文章 ID。我应该在哪里以及如何通过它?

class CreateCkeditorAssets < ActiveRecord::Migration[5.2]
  t.references :article, foreign_key: true
end

class Article < ApplicationRecord
  has_many :pictures, class_name: 'Ckeditor::Picture'
end

class Ckeditor::Picture < Ckeditor::Asset
  belongs_to :article
end

您不能传递文章 ID,因为在您上传图片时您的文章不会保留(除非您正在编辑已保存的文章)。

所以你可以做的是用一些唯一的标记构建一篇文章,然后在上传图片并保存文章后,更新 article_id 所有具有相同标记的图片。

像这样:(伪代码,未测试)

class Article < ApplicationRecord
  has_many :pictures, class_name: 'Ckeditor::Picture'

  after_save :assign_pictures

  private

  def assign_pictures
    Ckeditor::Picture.where(token: picture_token).update_all(article_id: id)
  end
end

-

class Ckeditor::Picture < Ckeditor::Asset
  belongs_to :article, optional: true
end

-

class Ckeditor::PicturesController
  def create
    @picture = Ckeditor::Picture.new
    @picture.token = params[:picture_token] # pass this param via javascript, see: https://github.com/galetahub/ckeditor/blob/dc2cef2c2c3358124ebd86ca2ef2335cc898b41f/app/assets/javascripts/ckeditor/filebrowser/javascripts/fileuploader.js#L251-L256
    super
  end
end

-

class ArticlesController < ApplicationController
  def new
    @article = Article.new(picture_token: SecureRandom.hex)
  end
end

显然,您需要将 picture_token 字段添加到您的 Article 模型,并将 token 字段添加到 Ckeditor::Picture。希望对您有所帮助。