CKEditor в Ruby on Rails c загрузкой файлов через SWFUpload
Достаточно часто появляется необходимость предоставить пользователям Вашего web-приложения возможность удобно редактировать содержимое. Для обычного пользователя оптимальным вариантом является использование WYSIWYG html-редактора. Таким решением является редактор CKEditor, интерфейс которого во многом подобен интерфейсам Microsoft Word и OpenOffice Writer.
Плагин rails-ckeditor предназначен для интеграции CKEditor'а в Rails-приложение. Также он включает в себя возможность загрузки изображений и файлов из интерфейса редактора через SWFUpload.
Первым шагом для начала использования CKEditor'а является установка плагина rails-ckeditor:
Затем копируем необходимые файлы CKEditor'а и SWFUpload'а в директорию public/ с помощью команды:
Генерируем пример конфигурационного файла плагина:
В результате появится файл config/ckeditor.yml, который стоит немного отредактировать:
options: &options
swf_file_post_name: "data"
swf_image_file_types_description: "Images"
swf_image_file_types: "*.jpg;*.jpeg;*.png;*.gif"
swf_image_file_size_limit: "5 MB"
swf_image_file_upload_limit: 10
swf_types_description: "Files"
swf_file_types: "*.doc;*.wpd;*.pdf;*.swf;*.xls"
swf_file_size_limit: "10 MB"
swf_file_file_upload_limit: 5
public_uri: "/system/ckeditor"
public_path: "system/ckeditor"
file_manager_uri: "/ckeditor/files"
file_manager_upload_uri: "/ckeditor/create?kind=file"
file_manager_image_upload_uri: "/ckeditor/create?kind=image"
file_manager_image_uri: "/ckeditor/images"
development:
<<: *options
production:
<<: *options
Для загрузки файлов и изображений плагин rails-ckeditor требует наличия моделей Asset, AttachmentFile и Picture. В качестве примера этих моделей можно использовать мой gist, в этом случае необходимо установить гем paperclip (gem install paperclip) и подключить его в config/environment.rb (config.gem 'paperclip').
После создания моделей, генерируем новую миграцию create_assets:
В ней создаем таблицу assets, в которой будет храниться информация о загруженных файлах и изображениях:
def self.up
create_table :assets do |t|
t.string :data_file_name
t.string :data_content_type
t.integer :data_file_size
t.integer :assetable_id
t.string :assetable_type, :limit=>25
t.string :type, :limit=>25
t.integer :user_id
t.timestamps
end
add_index "assets", ["assetable_id", "assetable_type", "type"], :name => "ndx_type_assetable"
add_index "assets", ["assetable_id", "assetable_type"], :name => "fk_assets"
add_index "assets", ["user_id"], :name => "fk_user"
end
def self.down
drop_table :assets
end
end
Выполняем созданную миграцию:
В случае если дефолтный роут map.connect ':controller/:action/:id' отключен, то в config/routes.rb необходимо добавить следующий роут:
Для использования CKEditor добавляем на страницу подключение необходимого javascript файла:
Вставлять CKEditor на форме можно с помощью FormBuilder хелперов, например:
...
<%= form.cktext_area :notes, :toolbar=>'Full', :width=>'400px', :heigth=>'200px' %>
...
<%= form.cktext_area :content, :swf_params=>{:assetable_type=>'User', :assetable_id=>current_user.id} %>
...
<% end %>
Related posts:

Дякую за перегляд плагіну. Хочу нагадати, що доступна версія для Rails 3 http://github.com/galetahub/rails-ckeditor/tree/rails3.
Також незабаром зроблю генерацію моделей для завантаження «create_assets» та пройдусь по багам.
Igor Galeta
13 Май 10 at 15:47
http://github.com/woto/blog Я у себя в блоге использовал этот плагин.
woto
17 Май 10 at 18:57
Спасибо за плагин.
А как использовать assetable_type, assetable_id при просмотре закачанных файлов?
Я никак не могу осознать место, где это впихнуть, чтобы просматривались аттачи только конкретного assetable
Mox
15 Май 11 at 18:35
Немного разобрался по поводу assetable. Чтобы просматривать только нужные assets, нужно
1) В параметрах ckeditor_textarea указать ckeditor_options => :ckeditor_options => { ‘filebrowserImageBrowseUrl’ => «/ckeditor/images/?assetable_type=MyAsset&assetable_id=#{@myasset.id}» }
2) Небольшой патч для ckeditor_controller – если в лоб, то как-то так:
if params[:assetable_type].blank? || params[:assetable_id].blank? @images = Ckeditor.image_model.find(:all, :order=>»id DESC») else @images = Ckeditor.image_model.find(:all, :conditions => [ '(assetable_type IS NULL AND assetable_id IS NULL) OR (assetable_type = ? AND assetable_id = ?)', params[:assetable_type], params[:assetable_id] ], :order => ‘id DESC’) end
Mox
15 Май 11 at 19:08