【问题标题】:Rails 3 use CKEditor with already existing paperclip modelRails 3 将 CKEditor 与现有的回形针模型一起使用
【发布时间】:2012-05-24 13:12:17
【问题描述】:

我在 Rails 3 中有一个 Web 应用程序,它已经有一个多态回形针模型。我已经附加了几个模型。

我很快意识到我需要一个好的所见即所得的文本区域编辑器,我用回形针安装了 ckeditor gem,但它为 ckeditor::pictures 和资产生成了自己的模型。

有没有办法覆盖 gem 在 ckeditor 中寻找的模型,以便我可以将现有的多态回形针模型与 ckeditor 一起使用?

【问题讨论】:

    标签: jquery ruby-on-rails paperclip ckeditor wysiwyg


    【解决方案1】:

    使用 gem 本身提供的这个生成器:

    rails generate ckeditor:install --orm=active_record --backend=paperclip
    

    【讨论】:

    • 但如果我这样做,它会创建自己的模型,我现在总共有 4 个模型,使用两个不同的数据库条目作为附件,我希望它尽可能 DRY。尤其是在数据库中。
    【解决方案2】:

    我发现您不能告诉 gem ckeditor 使用您现有的回形针模型,您必须使用它生成的回形针模型或不使用编辑器。然后,您将不得不通过分叉并进行编辑以使用您当前和现有的回形针模型来对抗宝石。

    如果您已经通过回形针或载波拥有现有的附件模型,我个人建议不要使用 ckeditor gem。只需从他们的网站获取ckeditor javascript 文件并以这种方式实现编辑器。

    您可以通过下载 javascript 文件来完成此操作,将它们放在您的 assets/javascript 目录中。然后将它们包含在您的 application.js 中

    【讨论】:

      【解决方案3】:

      我知道这个问题有点老了,但现在有一种方法可以设置模型。在config/initializers/ckeditor.rb 中有config.picture_modelconfig.attachment_file_model 设置可用于设置模型。

      【讨论】:

        【解决方案4】:

        如果您将图片模型和附件文件模型更改为从基本模型继承:

        class Ckeditor::Picture < Asset
        
        end
        

        并在您的基类中包含 Ckeditor:

        class Asset < ApplicationRecord
          include Ckeditor::Orm::ActiveRecord::AssetBase
          include Ckeditor::Backend::Paperclip
        
          belongs_to :attachable, :polymorphic => true
        
          has_attached_file :data,
            storage: :s3,
            s3_region: S3_CONFIG["region"],
            path: "assets/:attachment/:id/:style.:extension",
            :styles => lambda { |a| a.instance.styles },
            s3_credentials: {
                 access_key_id: S3_CONFIG["access_key_id"] ,
                 secret_access_key: S3_CONFIG["secret_access_key"]
               },
            s3_protocol: 'http',
            bucket: S3_CONFIG["bucket"]
        end
        

        并在初始化程序 (ckeditor.rb) 中更改表名:

        module Ckeditor
          module Orm
            module ActiveRecord
              module AssetBase
                def self.included(base)
                  base.send(:include, Base::AssetBase::InstanceMethods)
                  base.send(:extend, ClassMethods)
                end
                module ClassMethods
                  def self.extended(base)
                    base.class_eval do
                      self.table_name = 'assets'
                    end
                  end
                end
              end
            end
          end
        end
        

        它似乎有效。

        【讨论】:

          猜你喜欢
          • 2011-07-06
          • 2011-09-13
          • 2012-01-26
          • 2012-05-23
          • 2012-12-18
          • 1970-01-01
          • 2011-12-26
          • 2011-03-21
          • 1970-01-01
          相关资源
          最近更新 更多