snippet art
	assert_redirected_to ${1:action}: '${2:index}'
snippet artnp
	assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${0:@$2})
snippet artnpp
	assert_redirected_to ${1:parent}_${2:child}_path(${0:@$1})
snippet artp
	assert_redirected_to ${1:model}_path(${0:@$1})
snippet artpp
	assert_redirected_to ${0:model}s_path
snippet asd
	assert_difference '${1:Model}.${2:count}', ${3:1} do
		${0}
	end
snippet asnd
	assert_no_difference '${1:Model}.${2:count}' do
		${0}
	end
snippet asre
	assert_response :${1:success}, @response.body
snippet asrj
	assert_rjs :${1:replace}, '${0:dom id}'
snippet ass assert_select(..)
	assert_select '${1:path}', ${2:text}: '${3:inner_html}' ${4:do}
		${0}
	end
snippet ba
	before_action :${0:method}
snippet bf
	before_filter :${0:method}
snippet bt
	belongs_to :${0:association}
snippet btp
	belongs_to :${1:association}, polymorphic: true
snippet crw
	cattr_accessor :${0:attr_names}
snippet defcreate
	def create
		@${1:model_class_name} = ${2:ModelClassName}.new($1_params)

		respond_to do |format|
			if @$1.save
				flash[:notice] = '$2 was successfully created.'
				format.html { redirect_to(@$1) }
				format.xml  { render xml: @$1, status: :created, location: @$1 }
			else
				format.html { render action: 'new' }
				format.xml  { render xml: @$1.errors, status: :unprocessable_entity }
			end
		end
	end
snippet defdestroy
	def destroy
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])
		@$1.destroy

		respond_to do |format|
			format.html { redirect_to($1s_url) }
			format.xml  { head :ok }
		end
	end
snippet defedit
	def edit
		@${1:model_class_name} = ${0:ModelClassName}.find(params[:id])
	end
snippet defindex
	def index
		@${1:model_class_name} = ${2:ModelClassName}.all

		respond_to do |format|
			format.html # index.html.erb
			format.xml  { render xml: @$1s }
		end
	end
snippet defnew
	def new
		@${1:model_class_name} = ${2:ModelClassName}.new

		respond_to do |format|
			format.html # new.html.erb
			format.xml  { render xml: @$1 }
		end
	end
snippet defshow
	def show
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])

		respond_to do |format|
			format.html # show.html.erb
			format.xml  { render xml: @$1 }
		end
	end
snippet defupdate
	def update
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])

		respond_to do |format|
			if @$1.update($1_params)
				flash[:notice] = '$2 was successfully updated.'
				format.html { redirect_to(@$1) }
				format.xml  { head :ok }
			else
				format.html { render action: 'edit' }
				format.xml  { render xml: @$1.errors, status: :unprocessable_entity }
			end
		end
	end
snippet defparams
	def ${1:model_class_name}_params
		params.require(:$1).permit()
	end
snippet dele delegate .. to
	delegate :${1:methods}, to: :${0:object}
snippet dele delegate .. to .. prefix .. allow_nil
	delegate :${1:methods}, to: :${2:object}, prefix: :${3:prefix}, allow_nil: ${0:allow_nil}
snippet amc
	alias_method_chain :${1:method_name}, :${0:feature}
snippet flash
	flash[:${1:notice}] = '${0}'
snippet habtm
	has_and_belongs_to_many :${1:object}, join_table: '${2:table_name}', foreign_key: '${3}_id'
snippet hm
	has_many :${0:object}
snippet hmd
	has_many :${1:other}s, class_name: '${2:$1}', foreign_key: '${3:$1}_id', dependent: :destroy
snippet hmt
	has_many :${1:object}, through: :${0:object}
snippet ho
	has_one :${0:object}
snippet hod
	has_one :${1:object}, dependent: :${0:destroy}
snippet i18
	I18n.t('${1:type.key}')
snippet ist
	<%= image_submit_tag('${1:agree.png}', id: '${2:id}'${0}) %>
snippet log
	Rails.logger.${1:debug} ${0}
snippet log2
	RAILS_DEFAULT_LOGGER.${1:debug} ${0}
snippet logd
	logger.debug { '${1:message}' }
snippet loge
	logger.error { '${1:message}' }
snippet logf
	logger.fatal { '${1:message}' }
snippet logi
	logger.info { '${1:message}' }
snippet logw
	logger.warn { '${1:message}' }
snippet mapc
	${1:map}.${2:connect} '${0:controller/:action/:id}'
snippet mapca
	${1:map}.catch_all '*${2:anything}', controller: '${3:default}', action: '${4:error}'
snippet mapr
	${1:map}.resource :${0:resource}
snippet maprs
	${1:map}.resources :${0:resource}
snippet mapwo
	${1:map}.with_options ${2:controller}: '${3:thing}' do |$3|
		${0}
	end

###############################
#   model callback snippets   #
###############################

# before callback
snippet mbv
	before_validation :${0:method}
snippet mbc
	before_create :${0:method}
snippet mbu
	before_update :${0:method}
snippet mbs
	before_save :${0:method}
snippet mbd
	before_destroy :${0:method}

# after callback
snippet mav
	after_validation :${0:method}
snippet maf
	after_find :${0:method}
snippet mat
	after_touch :${0:method}
snippet macr
	after_create :${0:method}
snippet mau
	after_update :${0:method}
snippet mas
	after_save :${0:method}
snippet mad
	after_destroy :${0:method}

# around callback
snippet marc
	around_create :${0:method}
snippet maru
	around_update :${0:method}
snippet mars
	around_save :${0:method}
snippet mard
	around_destroy :${0:method}

snippet mcht
	change_table :${1:table_name} do |t|
		${0}
	end
snippet mp
	map(&:${0:id})
snippet mrw
	mattr_accessor :${0:attr_names}
snippet oa
	order('${0:field}')
snippet od
	order('${0:field} DESC')
snippet pa
	params[:${1:id}]
snippet ra
	render action: '${0:action}'
snippet ral
	render action: '${1:action}', layout: '${0:layoutname}'
snippet rest
	respond_to do |format|
		format.${1:html} { ${0} }
	end
snippet rf
	render file: '${0:filepath}'
snippet rfu
	render file: '${1:filepath}', use_full_path: ${0:false}
snippet ri
	render inline: "${0:<%= 'hello' %>}"
snippet ril
	render inline: "${1:<%= 'hello' %>}", locals: { ${2:name}: '${3:value}'${0} }
snippet rit
	render inline: "${1:<%= 'hello' %>}", type: ${0::rxml}
snippet rjson
	render json: '${0:text to render}'
snippet rl
	render layout: '${0:layoutname}'
snippet rn
	render nothing: ${0:true}
snippet rns
	render nothing: ${1:true}, status: ${0:401}
snippet rp
	render partial: '${0:item}'
snippet rpc
	render partial: '${1:item}', collection: ${0:@$1s}
snippet rpl
	render partial: '${1:item}', locals: { ${2:$1}: ${0:@$1} }
snippet rpo
	render partial: '${1:item}', object: ${0:@$1}
snippet rps
	render partial: '${1:item}', status: ${0:500}
snippet rt
	render text: '${0:text to render}'
snippet rtl
	render text: '${1:text to render}', layout: '${0:layoutname}'
snippet rtlt
	render text: '${1:text to render}', layout: ${0:true}
snippet rts
	render text: '${1:text to render}', status: ${0:401}
snippet ru
	render :update do |${1:page}|
		$1.${0}
	end
snippet rxml
	render xml: '${0:text to render}'
snippet sc
	scope :${1:name}, -> { where(${2:field}: ${0:value}) }
snippet sl
	scope :${1:name}, lambda do |${2:value}|
		where('${3:field = ?}', ${0:value})
	end
snippet sha1
	Digest::SHA1.hexdigest(${0:string})
snippet sweeper
	class ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper
		observe $1

		def after_save(${0:model_class_name})
			expire_cache($2)
		end

		def after_destroy($2)
			expire_cache($2)
		end

		def expire_cache($2)
			expire_page
		end
	end
snippet va validates_associated
	validates_associated :${0:attribute}
snippet va validates .., acceptance: true
	validates :${0:terms}, acceptance: true
snippet vc
	validates :${0:attribute}, confirmation: true
snippet ve
	validates :${1:attribute}, exclusion: { in: ${0:%w( mov avi )} }
snippet vf
	validates :${1:attribute}, format: { with: /${0:regex}/ }
snippet vi
	validates :${1:attribute}, inclusion: { in: %w(${0: mov avi }) }
snippet vl
	validates :${1:attribute}, length: { in: ${2:3}..${0:20} }
snippet vn
	validates :${0:attribute}, numericality: true
snippet vp
	validates :${0:attribute}, presence: true
snippet vu
	validates :${0:attribute}, uniqueness: true
snippet format
	format.${1:js|xml|html} { ${0} }
snippet wc
	where(${1:'conditions'}${0:, bind_var})
snippet wf
	where(${1:field}: ${0:value})
snippet xdelete
	xhr :delete, :${1:destroy}, id: ${2:1}
snippet xget
	xhr :get, :${1:show}, id: ${2:1}
snippet xpost
	xhr :post, :${1:create}, ${2:object}: ${3:object}
snippet xput
	xhr :put, :${1:update}, id: ${2:1}, ${3:object}: ${4:object}
snippet test
	test '${1:should do something}' do
		${0}
	end
###########################
#   migrations snippets   #
###########################
snippet mac
	add_column :${1:table_name}, :${2:column_name}, :${0:data_type}
snippet mai
	add_index :${1:table_name}, :${0:column_name}
snippet mrc
	remove_column :${1:table_name}, :${0:column_name}
snippet mrnc
	rename_column :${1:table_name}, :${2:old_column_name}, :${0:new_column_name}
snippet mcc
	change_column :${1:table}, :${2:column}, :${0:type}
snippet mnc
	t.${1:string} :${2:title}${3:, null: false}
snippet mct
	create_table :${1:table_name} do |t|
		${0}
	end
snippet migration class .. < ActiveRecord::Migration .. def up .. def down .. end
	class `substitute( substitute(vim_snippets#Filename(), '^\d\+_', '',''), '\(_\|^\)\(.\)', '\u\2', 'g')` < ActiveRecord::Migration
		def up
			${0}
		end

		def down
		end
	end
snippet migration class .. < ActiveRecord::Migration .. def change .. end
	class `substitute( substitute(vim_snippets#Filename(), '^\d\+_', '',''), '\(_\|^\)\(.\)', '\u\2', 'g')` < ActiveRecord::Migration
		def change
			${0}
		end
	end
snippet trc
	t.remove :${0:column}
snippet tre
	t.rename :${1:old_column_name}, :${2:new_column_name}
	${0}
snippet tref
	t.references :${0:model}
snippet tcb
	t.boolean :${1:title}
	${0}
snippet tcbi
	t.binary :${1:title}, limit: ${2:2}.megabytes
	${0}
snippet tcd
	t.decimal :${1:title}, precision: ${2:10}, scale: ${3:2}
	${0}
snippet tcda
	t.date :${1:title}
	${0}
snippet tcdt
	t.datetime :${1:title}
	${0}
snippet tcf
	t.float :${1:title}
	${0}
snippet tch
	t.change :${1:name}, :${2:string}, ${3:limit}: ${4:80}
	${0}
snippet tci
	t.integer :${1:title}
	${0}
snippet tcl
	t.integer :lock_version, null: false, default: 0
	${0}
snippet tcr
	t.references :${1:taggable}, polymorphic: { default: '${2:Photo}' }
	${0}
snippet tcs
	t.string :${1:title}
	${0}
snippet tct
	t.text :${1:title}
	${0}
snippet tcti
	t.time :${1:title}
	${0}
snippet tcts
	t.timestamp :${1:title}
	${0}
snippet tctss
	t.timestamps
	${0}
##########################
#     Rspec snippets     #
##########################
#ShouldaMatchers#ActionController
snippet isfp
	it { should filter_param :${0:key} }
snippet isrt
	it { should redirect_to ${0:url} }
snippet isrtp
	it { should render_template ${0} }
snippet isrwl
	it { should render_with_layout ${0} }
snippet isrf
	it { should rescue_from ${0:exception} }
snippet isrw
	it { should respond_with ${0:status} }
snippet isr
	it { should route(:${1:method}, '${0:path}') }
snippet isss
	it { should set_session :${0:key} }
snippet issf
	it { should set_the_flash('${0}') }
#ShouldaMatchers#ActiveModel
snippet isama
	it { should allow_mass_assignment_of :${0} }
snippet isav
	it { should allow_value(${1}).for :${0} }
snippet isee
	it { should ensure_exclusion_of :${0} }
snippet isei
	it { should ensure_inclusion_of :${0} }
snippet isel
	it { should ensure_length_of :${0} }
snippet isva
	it { should validate_acceptance_of :${0} }
snippet isvc
	it { should validate_confirmation_of :${0} }
snippet isvn
	it { should validate_numericality_of :${0} }
snippet isvp
	it { should validate_presence_of :${0} }
snippet isvu
	it { should validate_uniqueness_of :${0} }
#ShouldaMatchers#ActiveRecord
snippet isana
	it { should accept_nested_attributes_for :${0} }
snippet isbt
	it { should belong_to :${0} }
snippet isbtcc
	it { should belong_to(:${1}).counter_cache ${0:true} }
snippet ishbtm
	it { should have_and_belong_to_many :${0} }
snippet isbv
	it { should be_valid }
snippet ishc
	it { should have_db_column :${0} }
snippet ishi
	it { should have_db_index :${0} }
snippet ishm
	it { should have_many :${0} }
snippet ishmt
	it { should have_many(:${1}).through :${0} }
snippet isho
	it { should have_one :${0} }
snippet ishro
	it { should have_readonly_attribute :${0} }
snippet iss
	it { should serialize :${0} }
snippet isres
	it { should respond_to :${0} }
snippet isresw
	it { should respond_to(:${1}).with(${0}).arguments }
snippet super_call
	${1:super_class}.instance_method(:${0:method}).bind(self).call
