рд╣рдо Sinatra рдкрд░ рдПрдХ REST рдПрдкреНрд▓реАрдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ Redactor рдХреЛ рдлрд╛рд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рднрд╛рдЧ реи

рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ REST рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрд╛ рдФрд░ Redactor.js 1/3 рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ред рдЖрдЬ рд╣рдо рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдХрд░ рдЕрдкрдирд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреИрд░рд┐рдпрд░рд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдмреА рдкрде рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред

рдЪрд▓рд┐рдП рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реА init.rb рдлрд╝рд╛рдЗрд▓ рд╣реИ:
# coding: utf-8 require 'rubygems' require 'sinatra' require 'data_mapper' require 'carrierwave' require 'carrierwave/datamapper' require 'rmagick' require 'json' set :public_directory, './public' class ImageUploader < CarrierWave::Uploader::Base def store_dir 'uploads/images' end def extension_white_list %w(jpg jpeg gif png bmp) end include CarrierWave::RMagick version :thumb do process :resize_to_fill => [100,74] end storage :file end class Post include DataMapper::Resource property :id, Serial property :title, String property :body, Text end class UploadedImages include DataMapper::Resource property :id, Serial property :image, String property :thumb, String mount_uploader :file, ImageUploader end class UploadedFiles include DataMapper::Resource property :id, Serial property :name, String property :path, String end DataMapper.setup(:default, ENV['DATABASE_URL'] || 'sqlite:./db/base.db') DataMapper.finalize DataMapper.auto_upgrade! get '/' do 'REST   Sinatra <a href="/posts">  </a>' end #List posts get '/posts' do @posts = Post.all erb :'index' end #Create new Post get '/posts/new' do erb :'posts/new' end post '/posts/new' do params.delete 'submit' @post = Post.create(params) redirect '/posts' end #Edit post get '/posts/:id/edit' do @post = Post.get(params[:id]) erb :'posts/edit' end #Update post put '/posts/:id/edit' do post = Post.get(params[:id]) post.title = (params[:title]) post.body = (params[:body]) post.save redirect '/posts' end #Delete post get '/posts/:id/delete' do Post.get(params[:id]).destroy redirect '/posts' end post '/upload/image' do params[:file] filename = params[:file][:filename] file = params[:file][:tempfile] upload = UploadedImages.new upload.file = params[:file] upload.image = params[:image] = '/uploads/images/' + File.join(filename) upload.thumb = params[:thumb] = '/uploads/images/thumb_' + File.join(filename) upload.save @images = UploadedImages.all File.open("public/uploads/images/imageslist.json","w") do |f| f.write JSON.pretty_generate(@images) end '<img src="/uploads/images/' + File.join(filename) + '" />' end 

рдЗрд╕рд▓рд┐рдП, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / рдЕрдкрд▓реЛрдб рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдПрдХ рдирдпрд╛ UploadedFiles рдореЙрдбрд▓ рд▓рд┐рдЦреЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ
 set :files, File.join(settings.public_directory, 'uploads/files') #   public  (set :public_directory, './public'     init.rb)     ,     class UploadedFiles include DataMapper::Resource property :id, Serial # property :name, String #   property :path, String #    end post '/upload/file' do params[:file] filename = params[:file][:filename] file = params[:file][:tempfile] ext = File.extname(filename) #     ,    ,     . if ext == ".doc" || ext == ".zip" || ext == ".dmg" #   3    doc, zip, dmg,        . File.open(File.join(settings.files, filename), 'wb') # -  upload_f = UploadedFiles.new #  UploadedFile    upload_f.name = params[:name] = File.join(filename) #  UploadedFiles  :name,      upload_f.path = params[:path] = '/uploads/files/' + File.join(filename) #  UploadedFiles  :path,       upload_f.save # '<a href="/uploads/files/' + File.join(filename) + '" />' + File.join(filename) + '</a>' #      end end 

рдЕрдм рдпрд╣ рд╕рдВрдкрд╛рджрдХ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдЖрдЙрдЯ рдХреЛ рдЦреЛрд▓реЗрдВ

 $('.redactor_1').redactor({toolbar: 'default', lang: 'ru', imageUpload: '/upload/image', imageGetJson: '/uploads/images/imageslist.json'}); 

рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓рдЕрдк рд▓реЛрдбрд┐рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧ : '/ рдЕрдкрд▓реЛрдб / рдлрд╛рдЗрд▓' рдЬреЛрдбрд╝реЗрдВ
 $('.redactor_1').redactor({toolbar: 'default', lang: 'ru', imageUpload: '/upload/image', fileUpload: '/upload/file', imageGetJson: '/uploads/images/imageslist.json'}); 

рд╣рдордиреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдирд╛рдИрдВ: рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЕрдиреБрдордд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рдмрдирд╛рдпрд╛ред рдпрд╣рд╛рдВ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЕрдиреБрдордд рдПрдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 2 рдмрдЯрди рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Redactor.js рдлреНрд░реЗрдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ textarea рдореЗрдВ, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдЖрдк рдордгрд┐ рд╕рд┐рдирдЯреНрд░рд╛-рдлреНрд▓реИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлрд┐рд░ рд╕реЗ рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреГрд╖реНрда рд░реАрд▓реЛрдб рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЦреИрд░, рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд▓реЛрдЧ рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рдирд╛ рд╣реИред

рдЕрдм рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рд╕рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрдВред
Init.rb рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 #init.rb #List UploadedImages get '/images' do @ uploadedimage = UploadedImages.all #         /images (     uploadedimage) erb :'images' # images.erb end #Delete UploadedImage get '/images/:id/delete' do #     ID UploadedImages.get(params[:id]).destroy # ( ,   - ,      !...) redirect '/images' #       end 

рджреГрд╢реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ images.erb рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
 <strong><a href="/posts">   post'</a></strong> <h2>  </h2> <% @ uploadedimage.each do |uploadedimages| %> <a href="<%= uploadedimages.image %>"><img src="<%= uploadedimages.thumb %>"></a><br> #         <a href="/images/<%= uploadedimages.id %>/delete"></a><br><br> <% end %> 

рдЦреИрд░, рд╣рдордиреЗ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЫрд╡рд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрди рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛ред рдФрд░ рдпрд╣ рдЕрдВрдд рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд░реВрдмреА рдФрд░ рд╕рд┐рдирд╛рддреНрд░рд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдЕрдзрд┐рдХ рд▓реЗрдЦ рд╣реЛрдВрдЧреЗред
рдЬреАрдереБрдм рд╕реНрд░реЛрдд рдХреЛрдб
рдкреБрдирд╢реНрдЪ: рд╣рд░ рдЬрдЧрд╣ рдореИрдВ рднрд░ рдЖрдпрд╛
 <hh user=posts> 
рдпрд╛
 <hh user=images> 
рд╕рд┐рд░реНрдл @variable_name рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ


Source: https://habr.com/ru/post/In144488/


All Articles