Как назвать expire_fragment от Наблюдателя/Модели направляющих?

Я посмотрел на это, потому что я хотел ввести некоторые простые текстовые цвета в пакетный файл 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
29
задан Marston A. 26 December 2008 в 02:12
поделиться

8 ответов

Правовая оговорка: Мои направляющие немного ржавы, но это или что-то как он должны работать

ActionController::Base.new.expire_fragment(key, options = nil) 
43
ответ дан 28 November 2019 в 01:01
поделиться

В одном из моих сценариев я использую следующий взлом:

  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.

6
ответ дан 28 November 2019 в 01:01
поделиться

Я - немного новичок направляющих, таким образом, это не может быть корректно, или даже полезно, но кажется неправильным попытаться назвать действия контроллера из модели.

это не возможный записать действие в контроллере, который делает то, что Вы хотите и затем вызываете действие контроллера из своей задачи граблей?

2
ответ дан 28 November 2019 в 01:01
поделиться

Это довольно легко сделать. Можно реализовать предложение 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, но это не обязательно, чтобы сделать так для получения чего-то функционального (хотя ужасный и твердый поддержать.)

Развлекайтесь!

7
ответ дан 28 November 2019 в 01:01
поделиться

Почему бы не Ваши внешние задачи граблей называют метод истечения на контроллере. Тогда Вы все еще MVC совместимый, Вы не создаете в зависимости от некоторого взлома обзора, и т.д.

В этом отношении, почему Вы только не помещаете всего демона / внешняя функциональность на контроллере и имеете грабли / крон просто называет это. Это были бы загрузки, легче поддержать.

- MarkusQ

2
ответ дан 28 November 2019 в 01:01
поделиться

Это не могло бы работать на то, что Вы делаете, но можно быть в состоянии определить заказной вызов назад на модели:

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

Сообщенный мне, если это полезно!

1
ответ дан 28 November 2019 в 01:01
поделиться

Не будет ли проще и проще просто передать текущий контроллер в качестве аргумента для вызова метода модели? Примерно так:

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

Вы можете получить доступ ко всем общедоступным методам и свойствам контроллера изнутри модели. Пока вы не изменяете состояние контроллера, все будет в порядке.

2
ответ дан 28 November 2019 в 01:01
поделиться

Решение, предоставленное 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')

13
ответ дан 28 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: