вторник, октября 03, 2006

Inline layouts

В Rails уже давно есть возможность брать контент экшена не из файла, а передовать его в строке. Таким образом легко сделать простой CMS: берем шаблон из базы и делаем render :inline => . Проблема же построения более менее пригодного CMS заключалась в том, что подобную операцию нельзя было провести с лэйаутами.

Недавно я написал маленький плагин - Nested layouts (http://nested-layouts.rubyforge.org). Я решил, что возможность использования inline лэйаутов будет полезной добавкой к нему.

<% inside_inline_layout @layout_template do %>
content
<% end %>

Так что, кому надо - берите, пользуйте, пишите впечатления.

3 комментария:

Анонимный комментирует...

Что это ты по русски писать начал? :)

Unknown комментирует...

От англоязычных пользователей все равно, имхо, мало толку. А тут - русскоязычное Rails комьюнити.

Анонимный комментирует...

Я сделал cms проще. В качестве шаблона выступает самый обыкновенный контроллер и никаких проблем=)
Как это происходит(можно немного переделать под свои задачи)-есть 2 таблицы:
1) folders, нас интересуют поля id, parent_id и name. Если parent_id равен 0, то эта директория крепится к корню
2) pages. Поля name, folder_id и txt

В routes.rb пишем сей маленький скрипт(дополняем до необходимого):
pages = Page.find(:all)
for this_page in pages
if this_page.folder_id.to_i == 0
map.connect 'pages/' + this_page.name, :controller => this_page.template.controller, :action => this_page.template.action
else
this_folder = this_page.folder
result = this_folder.name + '/' + this_page.name
while this_folder.parent_id.to_i > 0
this_folder = Folder.find(:first, :conditions => ["id = ?", this_folder.parent_id])
result = this_folder.name + '/' + result
end
map.connect 'pages/' + result, :controller => this_page.template.controller, :action => this_page.template.action
end
end

Все страницы находятся в виртуальном нэймспейсе "pages/", чтобы не было конфликта имен. Все, мы перешли на нужный контроллер, который генерит скажем информацию для 3-х последних новостей. Но где-же контент? Делаем хэлпер или в другой удобной для нас форме, например load_content, который на основании страницы вытаскивает соответствующий ей контент и возращает. Готов=)
Максим, свяжись со мной пожалуйста(в конце убери цифру 5, она лишняя, защита от спама) - 389-179-4445