Создание генератора для Rails

Posted on February 10, 2007
По прежнему работая с Liquid я понял, что мне надоело писать код Drop`ов руками .... и решил сделать небольшой генератор.
Итак, в директории lib/ создаём generators
В ней размещаются все генераторы. Создаём в ней директорию liquid_drop
в ней нам необходимо создать наш генератор и шаблоны к нему в поддиректории templates/
Код генератора (liquid_drop_generator.rb)

class LiquidDropGenerator < Rails::Generator::Base
	attr_reader   :drop_name
	attr_reader   :actions

	def initialize(runtime_args, runtime_options = {})
	    super
	    @drop_name = args.shift || "example"
	    @actions = args
	end

	def manifest
		record do |m|
			 m.template 'drop.rb', File.join('app/drops',"#{drop_name}_drop.rb")
		end
	end
end
И код шаблона (templates/drop.rb)

class <%= drop_name %>Drop < Liquid::Drop

  def initialize(item) 
      @item = item
  end  

<% for action in actions -%>
  def <%= action %>
      
  end
  
<% end -%>

end
Конечно это очень простой генератор, но мне пока хватает и его ))
как всегда fast and dirty

Использование Drop в Liquid

Posted on February 05, 2007

Drops это очень хорошая вещь расширяющая возможности Liquid

Допустим мне необходимо сделать вывод информации о позициях каталога, каждая позиция имеет name, description и price

Для этого в app создаётся поддиректория drops в которой я создаю для модели дропа:


class ShopItemDrop < Liquid::Drop
  def initialize(item)
      @item = item
    end
    def name
      @item[:name]
    end
    def description
      @item[:description]
    end
    def price
      @item[:price]
    end
end

в модели shop_item пишу вызов дропа при преобразовании в Liquid
def to_liquid(options = {})
    ShopItemDrop.new self
end

После чего в отображении просто пишу:


{% for item in items %}
        {{item.name}}
        {{item.description}}
        {{item.price}}
{%endfor%}

Перезапускаю сервер ... oops ... ошибочка, конечно, rails ещё не знает где лежат дропы ...
открываем environment.rb и пишем следующую строчку  
config.loadpaths += %W( #{RAILSROOT}/app/drops )


установка Liquid в приложение.

Posted on February 05, 2007
Итак, для начала необходимо создать новое rails приложение
meg@MediaServer:~$ rails liquid_test
Затем необходимо установить плагин Liquid
meg@MediaServer:~$ cd liquid_test/vendor/plugins
meg@MediaServer:/home/meg/liquid_test/vendor/plugins$ svn export svn://home.leetsoft.com/liquid/trunk/liquid/
теперь можно создать простой контроллер для тестирование Liquid
meg@MediaServer:/home/meg/liquid_test$ script/generate controller hello index
Мы получили контроллер и отображение, переименуем расширение отображения в liquid и запишем внутрь следующее
Hello {{name}}
Затем добавим в контроллере

def index
@name = "UserAd"
end

Запускаем сервер и видим: Hello UserAd.
На этом пока что можно закончить

Применение шаблонного движка Liquid в Rails

Posted on February 05, 2007
При изучении RoR вначале мне очень не понравилось организация views, они меня очень смущали своими ASP тэгами и хотелось чего-то более привычного после PHP и Smarty. Как оказалось оно есть, и имя ему Liquid
Итак, синтакс шаблонов очень прост:
  • Простой вывод переменной шаблона делается так: Hello {{name}}
  • Фильтры вывода:
    Hello {{ 'tobi' | upcase }}
    Hello {{ 'tobi' | length }}
    Hello {{ '*tobi*' | textilize | upcase }}
    Hello {{ now | date: "%Y %h" }}
    Hello {{ 'Typo' | link_to: 'http://typo.leetsoft.com', 'Typo is a modern weblog engine' }}
  • Условия. Все условия имеют вид {% if условие %}
    Действие
    {% endif %}
  • Циклы:
    {% for item in array %} //действие {% endfor %}
В дальнейшем я опишу более подробно использование Liquid