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

рдпрд╣ рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл рд░реВрдмреА рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдЕрджреНрднреБрдд рднрд╛рд╖рд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ 3 рд╕рдкреНрддрд╛рд╣ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдЬреНрдЮрд╛рди рдЬрдорд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕рд┐рдирд╛рддреНрд░рд╛ рд░реВрдмреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред ( en.wikipedia.org )

Redactor - рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рд░рд▓ рдФрд░ рд╕реБрдВрджрд░ wysiwyg рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ( Habr├й рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ )

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИ!
рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реВрдмреА рдФрд░ SQLite рд╕реНрдерд╛рдкрд┐рдд рд╣реИред
рдЪреВрдВрдХрд┐ рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ Redactor рдХреЛ рдмрдиреНрдзрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рдпрд╛рд╕ рд╣реИ, рдЬрд╣рд╛рдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдердВрдмрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╣рдо рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Rmagick рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред рдУрдПрд╕ рдПрдХреНрд╕ рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ
curl https://raw.github.com/maddox/magick-installer/master/magick-installer.sh | sh 

рдЕрдм рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рддреНрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 [sudo] gem install sinatra data_mapper carrierwave carrierwave/datamapper json shotgun 

sintra - рдврд╛рдВрдЪрд╛ рд╣реА
data_mapper - ORM
рд╡рд╛рд╣рдХ - рдордгрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордгрд┐ (рд╣реИрдмреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд)
рд╡рд╛рд╣рдХрдорд╡ / рдбрд╛рдЯрд╛рдореЕрдкрд░ - рдбрд╛рдЯрд╛рдореИрдкрд░ рдФрд░ рдХреИрд░рд┐рдпрд░рд╡реЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП
json - JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдЖрд╡рд╢реНрдпрдХ рд░рддреНрди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрдм рд╕рдВрдкрд╛рджрдХ redactorjs.com/ru/download рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
рд╢реИрд▓реА рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХреНрд╕
 # coding: utf-8 require 'sinatra' get '/' do 'REST   Sinatra <a href="/posts">  </a>' end 

init.rb рдирд╛рдо рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рд╢реЙрдЯрдЧрди init.rb рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВ
рд╣рдо рдкрддреЗ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ http://127.0.0.1:9393/


рдЖрдкрдиреЗ / рдкреЛрд╕реНрдЯ рд▓рд┐рдВрдХ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ, рдЕрдм рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рд░рддреНрди рд╣рдо рдЖрд╡реЗрджрди рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред
 #init.rb # coding: utf-8 require 'rubygems' require 'sinatra' require 'data_mapper' require 'carrierwave' require 'carrierwave/datamapper' require 'rmagick' require 'json' 

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЬрд╣рд╛рдБ рд╣рдо рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗ (рдЖрдорддреМрд░ рдкрд░ рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓реЗрдВ, рдкреГрд╖реНрда рд▓реЗрдЖрдЙрдЯ рдЪрд┐рддреНрд░ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗ рдЧрдП рд╣реИрдВ)
 set :public_directory, './public' 

рдФрд░ рддреБрд░рдВрдд рдЗрд╕рдореЗрдВ js рдлреЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдбрд┐рдЯрд░ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдирд╛ рдкреЛрд╕реНрдЯ рдореЙрдбрд▓ рд▓рд┐рдЦреЗрдВрдЧреЗ
 #init.rb class Post include DataMapper::Resource property :id, Serial # property :title, String #String   ,   title    ""     50  property :body, Text #Text   ,   body    ""  65535  end 

рд╣рдорд╛рд░реА init.rb рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд░реВрдЯ рдореЗрдВ db рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ
 #init.rb DataMapper.setup(:default, ENV['DATABASE_URL'] || 'sqlite:./db/base.db') #     DataMapper.finalize #  DataMapper.auto_upgrade! #          

рдЪрд▓рд┐рдП / рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд░реВрдЯрд┐рдВрдЧ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ
 #init.rb #   get '/posts' do #   /posts @posts = Post.all #  @posts        Post erb :'index' #    index.erb* end 

* рд╕рд┐рдирд╛рддреНрд░рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрд░рдм рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдПрд░реВрдмрд┐рд╕

рдЕрдм рдЖрдЗрдП рдЕрдкрдиреЗ init.rb рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд░реВрдЯ рдореЗрдВ рд╡реНрдпреВ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ, рдлрд┐рд░ рд╕реЗ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рд┐рдирд╛рддреНрд░рд╛ рд╡реНрдпреВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ index.erb рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдПрдБ:
 #index.erb <strong><a href="/posts/new">  </a></strong> <h2>  </h2> <% @posts.each do |post| %> <strong><a href="/posts/<%= post.id %>/edit"><%= post.title %></a></strong><br> <%= post.body %><br> <% end %> 

рдЖрдЗрдП рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
рдпрд╛рдж рд░рдЦреЗрдВ, рдЖрдк рдФрд░ рдореИрдВ '/' рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд░ @posts = Post.all рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ? рддреЛ, рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде <% @ posts.each рдХрд░рддреЗ рд╣реИрдВ | рдкреЛрд╕реНрдЯ | %> ....... <% рдЕрдВрдд%> рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред
/ рдкреЛрд╕реНрдЯ / <% = post.id%> / рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рдХрд┐рд╕реА рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ, рд╣рдо рдЙрдирдХреА рдЖрдИрдбреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЛрд╕реНрдЯ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗ
<% = post.title%> - рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкреЛрд╕реНрдЯ рд╢реАрд░реНрд╖рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
<% = post.body%> - рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкреЛрд╕реНрдЯ рдмреЙрдбреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ

рдЕрдм рд╣рдореЗрдВ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реАрдПрд╕рдПрд╕ рдФрд░ рдЬреЗрдПрд╕ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рд╡реНрдпреВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд▓реЗрдЖрдЙрдЯ.рдмрд░реНрдм тАЛтАЛрдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдЪрд▓рд╛рдПрдВ, рдПрдХ рд╣реА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕рдореЗрдВ 2 рдлрд╛рдЗрд▓реЗрдВ edit.erb рдФрд░ new.erbред рдЕрдм рдЖрд╡реЗрджрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

 #layout.erb <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Redactor.js + Sinatra app</title> </head> <body> <%= yield %> </body> </html> 

<% = рдЙрдкрдЬ%> - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ - index.erb, new.erb, edit.bb

рдЕрдм рд╣рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ / рдкреЛрд╕реНрдЯ / рдирдпрд╛ рдЪрд╛рд╣рд┐рдП
Init.rb рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 #init.rb #Create new Post get '/posts/new' do #     erb :'posts/new' #  /posts/new.erb end post '/posts/new' do params.delete 'submit' @post = Post.create(params) # ,        Post redirect '/posts' #      end 

рдФрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ / рдкреЛрд╕реНрдЯ / new.erb рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
 #new.erb <h3></h3> <form method="post" action="/posts/new"> <label for="title"><strong>:</strong></label><br> <input id="title" type="text" name="title" value="" style="width: 250px;"> <br> <label for="body"><strong> :</strong></label><br> <textarea id="body" name="body" style="height: 250px;"></textarea> <br> <input type="submit" name="submit" value=""> </form> 

рд╣рдо "рдирдпрд╛ рдкреГрд╖реНрда рдмрдирд╛рдПрдБ" рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ

рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ, "рдмрдирд╛рдПрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдкреЛрд╕реНрдЯ рдмрдирд╛рдИ рдЧрдИ рд╣реИред

рдЕрдм рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред
 #init.rb #Edit post get '/posts/:id/edit' do #   ,       id @post = Post.get(params[:id]) #  @post      id  erb :'posts/edit' #  /posts/edit.erb 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 

рд╡рд┐рдЪрд╛рд░ / рдкреЛрд╕реНрдЯ / edit.erb рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
 #edit.erb <h3></h3> <a href="/posts/<%= @post.id %>/delete"> </a><br><br> <form action="/posts/<%= @post.id %>/edit" method="post"> <input name="_method" type="hidden" value="put" /> <label for="title"><strong>:</strong></label><br> <input type="text" name="title" id="title" value="<%= @post.title %>"> <br> <label for="body"><strong> :</strong></label><br> <textarea id="body" name="body" style="height: 250px;"><%= @post.body %></textarea> <br> <input id="post_submit" name="commit" type="submit" value=""> </form> 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрд╡реЗрджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рдЯреЗрдХреНрдЯреЗрд░рд╛ рдХреЗ рд▓рд┐рдП рд░реАрдбреИрдХреНрдЯреЛрд░ рдкреЗрдВрдЪ рд╣реИ

рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдУрдкрди рд╡реНрдпреВ / рд▓реЗрдЖрдЙрдЯ.рдмреАрдЖрд░рдмреА, рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝реЗрдВ
 #layout.erb <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="/js/redactor/redactor.js"></script> <link rel="stylesheet" href="/js/redactor/css/redactor.css" type="text/css"> 

рдЕрдм рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЖрдк рдпрд╣рд╛рдВ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред
 #layout.erb <script type="text/javascript"> $(document).ready(function() { $('.redactor_1').redactor({toolbar: 'default', lang: 'ru', imageUpload: '/upload/image', imageGetJson: '/uploads/images/imageslist.json'}); }); </script> 

$ ('ред redactor_1') - рд╕рдВрдкрд╛рджрдХ рдХреЛ redactor_1 рдирд╛рдо рд╕реЗ рдкреБрдХрд╛рд░рддреЗ рд╣реИрдВ
рдЯреВрд▓рдмрд╛рд░: 'рдбрд┐рдлрд╝реЙрд▓реНрдЯ' - рд╕рднреА рдмрдЯрди рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдЯреВрд▓рдмрд╛рд░ рд╕реЗрдЯ рдХрд░реЗрдВ
рд▓реИрдВрдЧ: 'рдЖрд░рдпреВ' - рд░реВрд╕реА рднрд╛рд╖рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
imageUpload: '/ upload / image' - рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗ
imageGetJson: '/uploads/images/imageslist.json' - рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓реЗрдЧреАред

рдЕрдм рд╣рдо textarea рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрдХ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рдЪрд╛рд░ / рдкреЛрд╕реНрдЯ / new.erb рдФрд░ рд╡рд┐рдЪрд╛рд░ / рдкреЛрд╕реНрдЯ / edit.erb рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрдЧ рд╡рд░реНрдЧ = "redactor_1" рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, new.erb рдХреЛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
 #new.erb <h3></h3> <form method="post" action="/posts/new"> <label for="title"><strong>:</strong></label><br> <input id="title" type="text" name="title" value="" style="width: 250px;"> <br> <label for="body"><strong> :</strong></label><br> <textarea id="body" class="redactor_1" name="body" style="height: 250px;"></textarea> <br> <input type="submit" name="submit" value=""> </form> 

рдФрд░ рдЗрд╕ рддрд░рд╣ edit.erb:
 #edit.erb <h3></h3> <a href="/posts/<%= @post.id %>/delete"> </a><br><br> <form action="/posts/<%= @post.id %>/edit" method="post"> <input name="_method" type="hidden" value="put" /> <label for="title"><strong>:</strong></label><br> <input type="text" name="title" id="title" value="<%= @post.title %>"> <br> <label for="body"><strong> :</strong></label><br> <textarea id="body" class="redactor_1" name="body" style="height: 250px;"><%= @post.body %></textarea> <br> <input id="post_submit" name="commit" type="submit" value=""> </form> 

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЪрд┐рддреНрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрдкрд▓реЛрдб рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / рдЕрдкрд▓реЛрдб / рдЪрд┐рддреНрд░ рд╣реИред
рдЕрдм рд╣рдо рд░рддреНрди рд╡рд╛рд╣рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред Init.rb рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:
 #init.rb class ImageUploader < CarrierWave::Uploader::Base def store_dir 'uploads/images' #     end def extension_white_list %w(jpg jpeg gif png bmp) #   jpg, jpeg, gif, png, bmp end include CarrierWave::RMagick # RMagick    version :thumb do process :resize_to_fill => [100,74] # RMagick'       end storage :file end 

рдЪреВрдВрдХрд┐ Redactor рд╣рдореЗрдВ рдЙрдирдХреЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпрд╛рдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ JSON рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо imageslist.json рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / рдЕрдкрд▓реЛрдб / рдЫрд╡рд┐рдпреЛрдВ / рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ Redactor рд╕рдордЭрддрд╛ рд╣реИред
 { "thumb": "/tests/_images/1_m.jpg", "image": "/tests/_images/1.jpg" }, 

рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ
 #init.rb class UploadedImages #      include DataMapper::Resource property :id, Serial property :image, String # property :thumb, String # mount_uploader :file, ImageUploader #  carrierwave end 

Init.rb рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:
 #init.rb 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 #   @images          JSON File.open("public/uploads/images/imageslist.json","w") do |f| # imageslist.json   f.write JSON.pretty_generate(@images) # JSON       end '<img src="/uploads/images/' + File.join(filename) + '" />'#    textarea    end 


рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдЬрдм рдЖрдк рдХреЛрдИ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ imageslist.json рдХреА рд╕рд╛рдордЧреНрд░реА рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреА рд▓рд╛рдЧрдд рдХрд┐рддрдиреА рд╣реИред

рдпрджрд┐ рд▓реЗрдЦ рдХреЛ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдЕрдЧрд▓реА рдмрд╛рд░ рдореИрдВ рдЗрд╕ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд╕рд╛рде рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреАред

рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ github рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ: рдореИрдВ рдЖрдкрд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛ рдбрд╛рдВрдЯреЗрдВ рдирд╣реАрдВ, рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рд╕рдорддрд▓ рдкрд░ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдмреЗрд╢рдХ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдХреЛрдб рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реВрдмреА рдФрд░ рд╕рд┐рдирд╛рддреНрд░рд╛ рдХреЛ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рд╣реИред рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

PSS: рдПрд╡рд░реАрд╡реНрд╣реЗрдпрд░ рдЖрдИ рдХрдо рдкрд╛рд░
 <hh user=posts> 
рдпрд╛
 <hh user=images> 
рдмрд╕ рдХреНрд░рдорд╢рдГ @posts рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВред

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


All Articles