无法使用Ckeditor、Paperclip和Ruby on Rails向图片模型添加参数

3

我有一个像这样的CKeditor图片模型:

class Ckeditor::Picture < Ckeditor::Asset
  before_save :set_vars
  has_attached_file :data,
                :url  => "/ckeditor_assets/pictures/:id/:style_:basename.:extension",
                :path => ":rails_root/public/ckeditor_assets/pictures/:id/:style_:basename.:extension",
                :styles => { :content => '600>',:medium => '300x300', :quintet => '150x150', :thumb => '118x100#' }

  validates_attachment_size :data, :less_than => 2.megabytes
  validates_attachment_presence :data

  def url_content
    url(:content)
  end

  protected
  def set_vars
    #self.assetable_id = id
    #self.assetable_type = controller_name
  end
end

我所希望的是在创建新图片时,“assetable_id”和“assetable_type”能够被填充(因为数据库表中有这些列)。我希望将它们传递为变量,例如与图片相关联的文章/事件/用户的ID以及图片所属的“模型”类型-再次是文章/事件/用户。
我不确定这是否是正确的解决方案,但我不知道如何修复它。关于CKeditor gem、配置设置和Rails的在线文档非常糟糕-我搜索了数小时,也找不到任何与我的需求相似的东西-所以请帮忙。
我知道如何调整上传的参数,但似乎没有一个能做到我想要的:
Started POST "/ckeditor/pictures?CKEditor=post%5B14%5D&CKEditorFuncNum=1&
langCode=en&%3Aassetable-id=0&assetable_type=post&
authenticity_token=fsKA68sxkzQpiSMmtcP782i4oI%2FA6KSIsSZuwO5zDWA%3D" for 127.0.0.1 at 
2013-04-15 10:05:06 +0200

Processing by Ckeditor::PicturesController#create as HTML

Parameters: {"upload"=>#<ActionDispatch::Http::UploadedFile:0x007f94f80beef8 
@original_filename="kb_new.png", @content_type="image/png", @headers="Content-
Disposition: form-data; name=\"upload\"; filename=\"kb_new.png\"\r\nContent-Type: 
image/png\r\n", @tempfile=#<File:/tmp/RackMultipart20130415-3130-1ls814r>>, 
"CKEditor"=>"post[14]", "CKEditorFuncNum"=>"1", "langCode"=>"en", ":assetable-id"=>"0", 
"assetable_type"=>"post", 
"authenticity_token"=>"fsKA68sxkzQpiSMmtcP782i4oI/A6KSIsSZuwO5zDWA="}
User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
[ALL THE FORMATING STUFF]


SQL (0.6ms)  INSERT INTO `ckeditor_assets` (`assetable_id`, `assetable_type`, `created_at`, `data_content_type`, `data_file_name`, `data_file_size`, `height`, `type`, `updated_at`, `width`) VALUES (NULL, '0', '2013-04-15 08:05:07', 'image/png', 'kb_new.png', 291770, 419, 'Ckeditor::Picture', '2013-04-15 08:05:07', 450)

[paperclip] Saving attachments.

(62.5ms)  COMMIT

Rendered text template (0.0ms)

Completed 200 OK in 929ms (Views: 0.5ms | ActiveRecord: 63.6ms)

还可以查看这个问题:

如何根据图片模型在Ruby On Rails中设置CKeditor中图像的大小?


我遇到了你曾经遇到过的相同的问题。但是我无法弄清如何向URL添加参数,以便实际将这些上传与用户关联起来。您能否给我一些提示,告诉我您是如何完成这个任务的?谢谢!! - nfriend21
4个回答

5
我实际上已经找到了解决方案,可以添加自定义参数到Rails中的Ckeditor上传。我也尝试了谷歌搜索,但是没有任何关于如何在Rails中添加自定义参数到Ckeditor上传的信息。
以下是我的解决方法:
1. 首先从表单开始。使用Ckeditor时,一切都由URL驱动。因此,当您单击图像图标并出现弹出窗口时,然后单击“浏览服务器”按钮,您会注意到它打开了一个新的弹出窗口,其中有一个URL。这是您需要修改的第一个URL。然后,当您实际上上传图像时,它将发送一个POST请求到另一个URL。那就是您需要修改的第二个URL。

默认情况下,这些URL设置为Ckeditor :: PicturesController上的“index”和“create”操作。这是宝石存储库中此控制器文件的链接,您稍后需要使用 - https://github.com/galetahub/ckeditor/blob/2dd963fae117726976e5bf1dc264e27d3741fea8/app/controllers/ckeditor/pictures_controller.rb

因此,逻辑上,我们需要修改这些URL,以便我们可以添加自己的自定义代码来控制发生的情况。所以这就是我所做的(注意“ckeditor”哈希):

<%= cktext_area_tag 'column1_body', @section, 
    :ckeditor => { 
      filebrowserImageUploadUrl: "/ckeditor/pictures?website_id=#{@website.id}",
      filebrowserImageBrowseUrl: "/picture_overrides" 
} %>

很棒。

2.首先,我使用“/picture_overrides”修改了filebrowserImageBrowseUrl。这意味着当有人点击浏览服务器按钮时,它将调用我的PictureOverridesController上的“index”操作。因此,我添加了路由,创建了控制器文件和视图。

对于视图,我完全从gem中复制了视图文件,位于https://github.com/galetahub/ckeditor/blob/master/app/views/ckeditor/pictures/index.html.erb。注意:其中有一个局部视图,所以您也需要获取该视图。

现在,在我的新“PictureOverridesController”文件中,我编辑了“index”操作如下:

def index
  # I need to find the website
  @website = Website.find_by_subdomain(request.subdomain)
  # I can scope @pictures to only contain the images the user should see.
  @pictures = Ckeditor::Picture.where(website_id: @website.id)
end

然后,在此过程中调用了一些其他的私有方法,因此您需要将以下代码添加到此控制器文件中(只需剪切并粘贴)。 您会注意到我从gem文件上的同一个控制器中获取了此代码。

  protected

  def find_asset
    @picture = Ckeditor.picture_adapter.get!(params[:id])
  end

  def authorize_resource
    model = (@picture || Ckeditor.picture_model)
    @authorization_adapter.try(:authorize, params[:action], model)
  end

现在,我的用户只会看到具有正确网站ID的图像。

现在,当用户通过Ckeditor上传图像时,我需要确保设置了网站ID。

3.虽然您可以修改此控制器文件上的create操作,并将URL设置为此URL,但我选择了不同的方法。如上所述,我只是将网站ID添加到URL中。不幸的是,Ckeditor::Picture实例不会自动保存这个。因此,我决定通过ApplicationController中的after_filter来完成此操作,如下所示:

    after_filter :ckeditor_add_website_id

    def ckeditor_add_website_id
      if params[:controller] == 'ckeditor/pictures' && params[:action] == 'create'
        @website = find_website_by_domain_subdomain(request)
        @picture.update_attributes(website_id: @website.id)
      end
    end

我可以帮助您翻译编程相关内容。这段文字的意思是“它只是工作。”

最后,不要忘记在使用Ckeditor的任何表单中添加自定义URL。


2

在我看来,最简单的解决方案是:

#controllers/application_controller.rb
protected

def ckeditor_pictures_scope(options = { :assetable_id => "#{current_page.id}" ,:assetable_type => "Page" })
  ckeditor_filebrowser_scope(options)
end

def ckeditor_attachment_files_scope(options = { :assetable_id => "#{current_page.id}" ,:assetable_type => "Page" })
  ckeditor_filebrowser_scope(options)
end


def ckeditor_before_create_asset(asset)
  asset.assetable = current_page if current_page
  return true
end

1
感谢nfriend21和wacaw提供的解决方案。 这个问题困扰了我一个星期!
wacaw的解决方案最简单、最清晰,但是我受到nfriend21的启发来完成它。对像我这样的新手很有用。
我有一个页面有许多编辑器,每个编辑器都有不同的ID(命名为column_id)。 我希望将column_id保存为Column类型的asset_id(在我的应用程序中定义的对象)。
1)我更改了页面上所有编辑器的URL:
for (instance in CKEDITOR.instances) {
          var editor = CKEDITOR.instances[instance];
          var id = editor.name.substr(6);

          if(editor) {
            editor.config.filebrowserImageBrowseUrl = "/ckeditor/pictures?column_id=" + id;
            editor.config.filebrowserImageUploadUrl = "/ckeditor/pictures?column_id=" + id;
          }
}

请注意,我将编辑器的ID作为包含它的div的ID的子字符串提取出来...即editor134、editor245等:我删除了前6个字符。
还要注意,我使用了ckeditor gem的原始PicturesController。
2)现在,在ApplicationController中稍微修改一下wacav的解决方案:
#controllers/application_controller.rb
protected

  def ckeditor_pictures_scope(options = { :assetable_id => params[:column_id], :assetable_type => "Column"})
    ckeditor_filebrowser_scope(options)
  end

  # to be modified: at this moment I'm interested in pictures only
  def ckeditor_attachment_files_scope(options = { :assetable_id => "#{current_page.id}" ,:assetable_type => "Page" })
    ckeditor_filebrowser_scope(options)
  end


  def ckeditor_before_create_asset(asset)
    asset.assetable = Column.find(params[:column_id])
    return true
  end

我希望它对其他人有所帮助。

-1

谢谢,我很感激你的帮助,但我无法从Ckeditor编辑器中编辑控制器(或者至少我认为我不能 - 请参见问题中的控制台跟踪)。问题纯粹围绕Ckeditor gem解决。 - Biketire
2
链接已失效,显示404页面未找到。 - Stefan Huska

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接