Я посмотрел на это, потому что я хотел ввести некоторые простые текстовые цвета в пакетный файл Win7. Это то, что я придумал. Спасибо за вашу помощь.
@echo off
cls && color 08
rem .... the following line creates a [DEL] [ASCII 8] [Backspace] character to use later
rem .... All this to remove [:]
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set "DEL=%%a")
echo.
<nul set /p="("
call :PainText 09 "BLUE is cold" && <nul set /p=") ("
call :PainText 02 "GREEN is earth" && <nul set /p=") ("
call :PainText F0 "BLACK is night" && <nul set /p=")"
echo.
<nul set /p="("
call :PainText 04 "RED is blood" && <nul set /p=") ("
call :PainText 0e "YELLOW is pee" && <nul set /p=") ("
call :PainText 0F "WHITE all colors"&& <nul set /p=")"
goto :end
:PainText
<nul set /p "=%DEL%" > "%~2"
findstr /v /a:%1 /R "+" "%~2" nul
del "%~2" > nul
goto :eof
:end
echo.
pause
Правовая оговорка: Мои направляющие немного ржавы, но это или что-то как он должны работать
ActionController::Base.new.expire_fragment(key, options = nil)
В одном из моих сценариев я использую следующий взлом:
require 'action_controller/test_process'
sweepers = [ApartmentSweeper]
ActiveRecord::Base.observers = sweepers
ActiveRecord::Base.instantiate_observers
controller = ActionController::Base.new
controller.request = ActionController::TestRequest.new
controller.instance_eval do
@url = ActionController::UrlRewriter.new(request, {})
end
sweepers.each do |sweeper|
sweeper.instance.controller = controller
end
Затем после того как обратные вызовы ActiveRecord называют, либеро могут назвать expire_fragment.
Я - немного новичок направляющих, таким образом, это не может быть корректно, или даже полезно, но кажется неправильным попытаться назвать действия контроллера из модели.
это не возможный записать действие в контроллере, который делает то, что Вы хотите и затем вызываете действие контроллера из своей задачи граблей?
Это довольно легко сделать. Можно реализовать предложение Orion, но можно также реализовать более широкую технику, проиллюстрированную ниже, который предоставляет Вам доступ к текущему контроллеру из любой модели и для того, какой бы ни цель, к которой Вы решили повредить разделение MVC для (например, смешивающий с кэшем фрагмента, получив доступ current_user
, генерировав ПУТИ/URL, и т.д.)
для получения доступа к контроллер текущего запроса (если таковые имеются) от [1 110] любой модель , добавляет следующее к environment.rb
или, очень предпочтительно, к новому плагину (например, создайте vendor/plugins/controller_from_model/init.rb
содержащий код ниже):
module ActiveRecord
class Base
protected
def self.thread_safe_current_controller #:nodoc:
Thread.current[:current_controller]
end
def self.thread_safe_current_controller=(controller) #:nodoc:
Thread.current[:current_controller] = controller
end
# pick up the correct current_controller version
# from @@allow_concurrency
if @@allow_concurrency
alias_method :current_controller, :thread_safe_current_controller
alias_method :current_controller=, :thread_safe_current_controller=
else
cattr_accessor :current_controller
end
end
end
Затем в app/controllers/application.rb
,
class ApplicationController < ActionController::Base
before_filter { |controller|
# all models in this thread/process refer to this controller
# while processing this request
ActiveRecord::Base.current_controller = controller
}
...
Затем из любой модели ,
if controller = ActiveRecord::Base.current_controller
# called from within a user request
else
# no controller is available, didn't get here from a request - maybe irb?
fi
Во всяком случае, в Вашем особом случае Вы могли бы хотеть ввести код в свое различное ActiveRecord::Base
потомки, когда соответствующие классы контроллера загружаются, так, чтобы фактический осведомленный о контроллере код все еще находился в app/controllers/*.rb
, но это не обязательно, чтобы сделать так для получения чего-то функционального (хотя ужасный и твердый поддержать.)
Развлекайтесь!
Почему бы не Ваши внешние задачи граблей называют метод истечения на контроллере. Тогда Вы все еще MVC совместимый, Вы не создаете в зависимости от некоторого взлома обзора, и т.д.
В этом отношении, почему Вы только не помещаете всего демона / внешняя функциональность на контроллере и имеете грабли / крон просто называет это. Это были бы загрузки, легче поддержать.
- MarkusQ
Это не могло бы работать на то, что Вы делаете, но можно быть в состоянии определить заказной вызов назад на модели:
class SomeModel < ActiveRecord::Base
define_callback :after_exploded
def explode
... do something that invalidates your cache ...
callback :after_exploded
end
end
можно тогда использовать щетку как Вы, обычно был бы:
class SomeModelSweeper < ActionController::Caching::Sweeper
observe SomeModel
def after_exploded(model)
... expire your cache
end
end
Сообщенный мне, если это полезно!
Не будет ли проще и проще просто передать текущий контроллер в качестве аргумента для вызова метода модели? Примерно так:
def delete_cascade(controller)
self.categories.each do |c|
c.delete_cascade(controller)
controller.expire_fragment(%r{article_manager/list/#{c.id}.*})
end
PtSection.delete(self.id)
controller.expire_fragment(%r{category_manager/list/#{self.id}.*})
end
Вы можете получить доступ ко всем общедоступным методам и свойствам контроллера изнутри модели. Пока вы не изменяете состояние контроллера, все будет в порядке.
Решение, предоставленное Orion, работает отлично. В качестве улучшения и для удобства я поместил следующий код в config / initializers / active_record_expire_fragment.rb
class ActiveRecord::Base
def expire_fragment(*args)
ActionController::Base.new.expire_fragment(*args)
end
end
Теперь вы можете использовать expire_fragment во всех экземплярах ActiveRecord :: Base, например User.first.expire_fragment ('user-stats')