Как визуализировать строку в Rails 3.2.1 (например, render :partial, но все, кроме файловой системы)

Я сделал небольшой суть этого, но в основном то, что я хотел бы сделать, это

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

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

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


person walt_die    schedule 23.02.2012    source источник
comment
@AbePetrillo проверил ссылку, у меня она работает? хммм - извините, если вы этого не видите ‹ :(   -  person walt_die    schedule 23.02.2012


Ответы (2)


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

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

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

In shared/_string:

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

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

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

In shared/_string:

<%= a_string %>

Или, если ваша строка содержит ERB, который необходимо выполнить, попробуйте:

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

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

person JDutil    schedule 23.02.2012
comment
да - проблема не в рендере как таковом; проблема в том, что если/когда я вызываю рендеринг, я попадаю в хорошо известный DoubleRender Act - person walt_die; 23.02.2012
comment
Как насчет отредактированного ответа на частичный рендеринг, который отображает вашу искомую строку. - person JDutil; 23.02.2012
comment
Я тестирую его на views/users/mailer/confirmation_instructions.html.erb, в котором есть ваш ‹%= render partial: 'templates/template', locals: { template: find_template('mail подтверждение') } %› # views/ templates/_template.haml в свою очередь имеет: = render text: template но он скармливает мне строку из шаблона в комплекте с Erb и все - фактически нетронутый! Но - JDutil - спасибо за попытку ‹ :) - person walt_die; 23.02.2012
comment
Есть способ казнить эрба. Нужно посмотреть, как выполнить ERB, а затем в вашем шаблоне вызвать метод(ы) для выполнения передачи ERB в вашу переменную. Я попробую быстрый поиск, но это определенно возможно, и, двигаясь в правильном направлении, я просто забыл, как выполнить эрб на макушке, хотя я делал это раньше. - person JDutil; 23.02.2012
comment
Я обновил ответ с помощью ‹%= ERB.new(a_string).result %›, который должен выполнить ERB. См. stackoverflow.com/questions/980547. - person JDutil; 23.02.2012
comment
Эндрю Уайт из команды Rails любезно показал мне, но не знал о привязке(), поэтому решил попробовать. Увы, это снова огорчило меня :( рендеринг обычного Erb (и HAML) работает нормально - но я не могу вызвать render, link_to или любую другую доброту Rails в этом отношении - что означает, что все мои существующие шаблоны мертвы в воде ( по крайней мере, в отношении этой области - рендеринг времени работает, как обычно, - но я не могу скопировать / вставить их в свою базу данных и начать рендеринг всего из базы данных. Должно быть, что-то упущено - person walt_die; 23.02.2012
comment
Вы добавляете шаблоны через веб-интерфейс? Что вы можете и должны сделать, так это выполнить erb и сохранить результаты в БД. Затем, когда вы вытащите его, вы можете просто сделать первоначальную идею простого рендеринга (конечно, с #html_safe). Таким образом, когда вы компилируете его во время сохранения, у вас должен быть доступ к вашим вспомогательным методам Rails, и тогда вам не нужно иметь накладные расходы на его обработку, когда вы хотите его отобразить. - person JDutil; 23.02.2012

Ответ — по крайней мере, на мой вопрос — довольно запутанный и требует глубокого изучения внутренностей стека Rails! Я просто подражаю: посмотрите полный ответ в книге Хосе Валима, Создание приложений Rails!

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

я добавил

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' )

и заменил содержимое моих представлений/макетов/application.haml на:

= render 'posts/edit'

и ура :)

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

person walt_die    schedule 29.02.2012
comment
Хосе Валим рассказывает об этом в своей книге, и это здорово. - person Giles Bowkett; 21.08.2012
comment
@GilesBowkett - да! - и если мой «ответ», кажется, вызывает запах оригинальной работы, я виноват (обновил ответ ссылкой на достопочтенного сэра Хосе Валима) :) - person walt_die; 24.09.2012