Как отобразить строку в Rails 3.2.1 (например, render: частичный - но все, кроме файловой системы) - PullRequest
1 голос
/ 23 февраля 2012

Я сделал небольшую суть , но в основном я хотел бы

<%= render "this is a #{ I18n.translate(:a_string) }" %>

Сохранение фрагментов и / или целых шаблонов views_templates (например, views / mailers /)some_model / regards.haml) в базе данных позволит мне создавать иерархии шаблонных представлений полностью из веб-интерфейса - и сохранять проектировщиков туда и обратно для загрузки файлов на сервер, или при менее напыщенных обстоятельствах, позволяя пользователям редактировать незначительныеошибки в самих шаблонах.

Приведенный выше пример никоим образом не отражает масштаб проблемы, но указывает на суть ее: как визуализировать шаблон, обычно находящийся в файловой системе, теперь являющийся текстомАтрибут модели шаблона в базе данных.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Ответ - по крайней мере, на мой вопрос - довольно запутанный, и требует много копаться во внутренностях стека Rails! Я просто копирую здесь: посмотрите полный ответ в книге Хосе Валима, Crafting Rails Applications !

В Rails 3.2.1 (возможно, даже раньше) шаблоны (как, например, в app / views / posts / show.haml) «найдены» чем-то, называемым Resolver, и можно добавить собственные Resolver, которые Я сделал :) 1005 *

Я добавил

class ViewTemplate < ActiveRecord::Base
    class Resolver < ActionView::Resolver
      def find_templates(name, prefix, partial, details)
        conditions = {
          :path    => normalize_path(name, prefix),
          :locale  => normalize_array(details[:locale]).first,
          :display_format  => normalize_array(details[:formats]).first,
          :handler => normalize_array(details[:handlers]),
          :partial => partial || false
        }
        ViewTemplate.where(conditions).map do |record|
          initialize_template(record)
        end
      end
    end
end

и затем я сказал своему ApplicationController сначала посмотреть на мой собственный путь:

class ApplicationController < ActionController::Base
  append_view_path ViewTemplate::Resolver.new
end

и, наконец, я добавил запись в свой ViewTemplate с

ViewTemplate.create( content: '=render "form"', path: 'posts/edit', display_format: 'html', handler: 'haml' )

и заменил содержимое моих view / layouts / application.haml на:

= render 'posts/edit'

и хуза :)

(ну, более или менее - есть проблемы с причинами, такие как переменные и области видимости - но, эй, нет ничего идеального)

0 голосов
/ 23 февраля 2012

Вы можете визуализировать частичное для универсального шаблона:

<%= render :partial => 'shared/string' %>

Затем частичный шаблон выполняет рендеринг строки:

В shared/_string:

<%= "this is a #{ I18n.translate(:a_string) }" %>

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

<%= render :partial => 'shared/string', :locals => {:a_string => String.find(:string_id)} %>

В shared/_string:

<%= a_string %>

Или, еслиВаша строка содержит ERB, который должен быть выполнен. try:

<%= ERB.new(a_string).result %>

Рендеринг партиала, подобного этому, не должен вызывать ошибку DoubleRender.

...