DRY CRUD рдХреЗ рд╕рд╛рде рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ

рдкрдЯрд░рд┐рдпреЛрдВ рдкрд░ рд░реВрдмреА рдмрд╕ рдореБрдЭреЗ рдореЛрд╣рд┐рдд рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рддрдХ, рд╕реАрдЖрд░рдпреВрдбреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рдкреАрдврд╝реА рдПрдХ рдЪреБрдиреМрддреА рдереАред

рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдЫрдВрдЯрд╛рдИ, рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдкреГрд╖реНрдард╛рдВрдХрди рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдореБрдЭреЗ рд░реЗрд▓ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдореИрдВрдиреЗ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдПрдХ рднреА рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдореБрдЭреЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛:

рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореБрдЭреЗ Yii рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдкрд╕рдВрдж рдХрд┐рдП рдЧрдП CGridView рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдЧрднрдЧ рдЕрдкрдиреА рдмрд╛рдЗрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреАрдлрд╛ рджреЗ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди DRY CRUD рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╕рдордЭреЗрдЧрд╛, рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЛ рдФрд░ рднреА рдЙрдкрдпреБрдХреНрдд рдЙрдкрдХрд░рдг рдмрддрд╛рдПрдЧрд╛ред

рд╕реНрдерд╛рдкрдирд╛


DRY CRUD рдПрдХ рд░рддреНрди рд╣реИ рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдирд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреАрдврд╝реА рдХреЗ рдмрд╛рдж рдордгрд┐ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд░рддреНрди рдореЗрдВ рдордгрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
gem 'dry_crud', '= 1.7.0' 

рд░рди
 bundle install 

рдФрд░ рдЬрдирд░реЗрдЯрд░
 rails generate dry_crud --templates haml --tests rspec 


рдЕрд╡рд╕рд░ рдкреНрд░рджрд░реНрд╢рди


рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдкреЛрд╕реНрдЯ рдореЙрдбрд▓ рд╕реЗ рдПрдХ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдзреЛрдВ рд╕реЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ред
 rails generate model User name:string email:string pass:string rails generate model Post author_id:integer title:string content:text is_draft:boolean 

рдордиреБрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, to_s рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбрд▓ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
 #user.rb class User < ActiveRecord::Base attr_accessible :email, :name, :pass has_many :posts def to_s "#{name}" end end #post.rb class Post < ActiveRecord::Base attr_accessible :user_id, :content, :is_draft, :title belongs_to :user def to_s "#{title}" end end 

рддрдм / app / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдпрд╣ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЗрд╕реЗ CrudController рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ ред рдЖрдк рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдХреЙрд▓рдо рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
 #users_controller.rb class UsersController < CrudController self.search_columns = [:name, :email] end 

рдпрд╣ рд╕рдм, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЫрдВрдЯрдиреА (рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЙрд▓рдо) рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕реАрдЖрд░рдпреВрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ self.search_columns рд╕реНрдерд╛рдкрд┐рдд рд╣реИ) рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред


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

рдФрд░ рд╣рд╛рдВ, рдпрд╣ рд╕рдм рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдЯреНрд╡рд┐рдЯрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрдиреЗрдХреНрд╢рди

рдореЗрд░реА рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЯреНрд╡рд┐рдЯрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдФрд░ DRY CRUD рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдЯреНрд╡рд┐рдЯрд░-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рд░реЗрд▓ рд░рддреНрди рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ , рдЗрд╕реЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
 rails generate bootstrap:install less 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡рд┐рдЪрд╛рд░ / рд▓реЗрдЖрдЙрдЯ / crud.html.haml рдФрд░ /app/assets/stylesheets/sample.scss рд╣рдЯрд╛рдПрдВ рдФрд░ /app/views/layouts/application.html рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ ред рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рдбрд┐рдЬрд╝рд╛рдЗрди рдорд┐рд▓рддрд╛ рд╣реИ:


рдХреЙрд▓рдо рдЫрд┐рдкрд╛рдПрдВ

рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ create_at рдФрд░ updated_at рдХреЙрд▓рдо рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реЗрд▓реНрдкрд░ рдХреЛ рдмрджрд▓реЗрдВред
 #/app/helpers/list_helper.rb def default_attrs attrs = model_class.column_names.collect(&:to_sym) attrs - [:id, :position, :password, :created_at, :updated_at] #<   end 


рдХреЙрд▓рдо рд╕реЗрдЯ рдмрджрд▓реЗрдВ

рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ, рдкрд╛рд╕ рдХреЙрд▓рдо рдЫрд┐рдкрд╛рдПрдБ рдФрд░ create_at рдЬреЛрдбрд╝реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реЛрд▓реНрдбрд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡рд┐рдЪрд╛рд░ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдЖрдВрд╢рд┐рдХ /app/views/crud/_form.html.hamed рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
рдкрд╣рд▓реА рдФрд░ рдПрдХрдорд╛рддреНрд░ рдкрдВрдХреНрддрд┐ = crud_table рдЙрди рд╕реНрддрдВрднреЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛрдбрд╝реЗрдВ = crud_table рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
 = crud_table :name, :email, :created_at 

рдкрд░рд┐рдгрд╛рдо:


рд╕реНрд╡рд░реВрдкрдг рд╕реЗрд▓ рд╕рд╛рдордЧреНрд░реА

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреЛрд╕реНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ:

рдЗрд╕реЗ 100 рд╡рд░реНрдгреЛрдВ рдкрд░ рдЯреНрд░рд┐рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╣реЗрд▓реНрдкрд░ рдореЗрдВ format_ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ
 #/app/helpers/post_helper.rb module PostHelper def format_content(post) truncate(post.content, :length => 100, :omission => '...') end end 

рдкрд░рд┐рдгрд╛рдо:


рд╕реНрдерд╛рдиреАрдпрдХрд░рдг

рдЖрдк рд░реЗрд▓ L18n рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЦреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднрд╛рд╖рд╛ рд╕реЗрдЯ рдХрд░реЗрдВ:
 #/config/application.rb .... module DryCrudSample class Application < Rails::Application ... I18n.default_locale = :ru end end 


рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ "l18n_generator" рдордгрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
 #Gemfile group :development do gem 'i18n_generators' end 


рд░реЗрд▓-рдЖрдИ 18 рдПрди рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
 rails generate i18n_locale ru 


рдЕрдиреБрд╡рд╛рдж рдлрд╝рд╛рдЗрд▓ /config/locales/en_crud.yml рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ DRY CRUD рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди ru_crud.yml рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВред
рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ YAML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
 rails generate i18n_translation ru 

рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ /config/locales/translation_ru.yml рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ ru_models.yml рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ
рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдирд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИ:


рд╕рдВрдкрд╛рджрди рдХреЗ рдмрд╛рдж рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди

рдЪрд┐рддреНрд░ рдЦрддреНрдо рд╣реЛ рдЧрдП рд╣реИрдВ, рдПрдХ рдЧрд╣рд░рд╛ рд╕рдорд╛рдпреЛрдЬрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдиреЗ рдпрд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ ("рд╢реЛ" рдПрдХреНрд╢рди) рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ "рдЗрдВрдбреЗрдХреНрд╕" рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдерд╛:
 #/app/controllers/crud_controller.rb def update(options = {}, &block) assign_attributes updated = with_callbacks(:update, :save) { entry.save } #respond_with(entry, options.reverse_merge(:success => updated), &block) #<-  respond_with(entry, options.reverse_merge(:success => updated, :location=> index_url), &block) # end 

create рд╡рд┐рдзрд┐ рдореЗрдВ рднреА рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдлрд┐рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдлреЙрд░реНрдо рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╣рдорд╛рд░реЗ рдкреЛрд╕реНрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрд╕ update рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд URL рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:
 #/app/controllers/posts_controller.rb def update super location: edit_post_path(params[:id]) end 


рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЙрд▓рдо рдореЗрдВ рдмрдЯрди рдЬреЛрдбрд╝рдирд╛

рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреНрд▓реЛрдирд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯ, рдкрд╣рд▓реЗ рд╕рдВрд╕рд╛рдзрди рдорд╛рд░реНрдЧ рдореЗрдВ рдПрдХ рдирдИ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
 #routes.rb resources :posts do get :clone, :on => :member end 

рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА id рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рд╣реЛрдЧреА рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рднрд░реЗ рд╣реБрдП рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдлреЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрдорд┐рдЯ рдлреЙрд░реНрдо create рдПрдХреНрд╢рди рдкрд░ рд╣реЛрдВрдЧреЗред
рдореИрдВрдиреЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдореЙрдбрд▓ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЛрдб рд░рдЦрд╛:
 #/app/controllers/crud_controller.rb def duplicate_entry() set_model_ivar( find_entry.dup() ) end 


рдмрдЯрди рдкреАрдврд╝реА рдХреЛрдб рд╕рд╣рд╛рдпрдХ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ:
 #/app/helpers/crud_helper.rb def action_col_clone(table, &block) action_col(table) do |e| link_table_action('list-alt', action_path(e, &block)) #       end end 


рджреГрд╢реНрдп рдореЗрдВ рдХреЙрд▓рдо рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдирдпрд╛ рдмрдЯрди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:
 #/app/views/posts/_list.html.haml = crud_table :title, :content, :is_draft do |t| - action_col_clone t do |e| - clone_post_path e #     

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдХреЗрд╡рд▓ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдЕрдм рдЖрдк рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдореЗрдВ "рдХреНрд▓реЛрди" рдмрдЯрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ!

рдирд┐рд╖реНрдХрд░реНрд╖


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, "рдбреАрдк_рдХреНрд▓реЛрдирдмрд▓" рд░рддреНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде ActiveRecord рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдлреЙрд░реНрдо рдореЗрдВ рдЖрдк рди рдХреЗрд╡рд▓ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд "has_many" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рди рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯрдлреАрд▓реНрдб, рдмрд▓реНрдХрд┐ рдХрдИ рдЪрдпрдиред рдФрд░ рдпрд╣ рд╕рдм рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЕрдзреНрдпрдпрди рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ DRY CRUD рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред

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

рд╕рдВрджрд░реНрдн


рдордгрд┐ DRY CRUD рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢
рдЧрд┐рдЯрд╣рдм рдирдореВрдирд╛ рд╕реНрд░реЛрдд

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


All Articles