Шаблон JSON Erb не может найти другой частичный HTML - PullRequest
10 голосов
/ 23 марта 2011

Я пытаюсь получить ответ json, в котором какое-то значение представляет собой html, представленный частичным

#projects_Controller.rb

def index
  respond_to do |f|
    f.json 
  end
end

# index.json.erb

  {
     "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>"
  }

Но я получаю следующую ошибку:

  ActionView::Template::Error (Missing partial projects/disclaimer with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>
  [:json], :locale=>[:en, :en]} in view paths "c:/rails/app/views", "c:/rails/vendor/plugins/more/app/views", "C:/Ruby192/lib/ruby/gems/1.9.1/gems/devise-1.1.8/app/views")

Похоже, запросы JSONчастично отображает с именем .json.erb, но не .html.erb, что у меня есть.Есть ли способ для меня, чтобы указать «HTML».

ДОБАВЛЕНО: Если запрос является «JS», и в index.js.erb я рендеринг почти тот же код: # index.js.erb

  disclaimer = {
     "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>"
  }

он находит проекты / disclaimer.html.erb и отображает его правильно.Интересно, почему такая несогласованность заключается в том, что если кто-то запрашивает js, то любой частичный рендеринг в его шаблоне будет искать part_name.html.erb, но если один запрашивает json, частичный рендеринг будет запрашивать частичный_имя.json.erb?

Спасибо

Ответы [ 4 ]

13 голосов
/ 25 марта 2011

Понял: все, что нужно, это строка в файле .json.erb <% self.formats = ["html"]%>

Итак, полный index.json.erb

      <% self.formats = ["html"] %>
      disclaimer = {
        "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer',
                    :content_type => 'text/html'), 
                    :locals => {:localVariable => @localVariable} 
                %>"
      }
5 голосов
/ 07 апреля 2011

Мой ответ похож на ответ Ника. У меня есть следующий помощник для шаблонов json.erb:

# helpers useful for json.erb templates
module JsonHelper

  # Same as render but force actionview to look for html templates instead of json.
  def render_html(options={}, locals={}, &block)
    old_formats = formats
    self.formats = [:html] # hack so partials resolve with html not json format
    render options, locals, &block  

  ensure
    self.formats = old_formats 
  end 

  # json escape a string. For example <%=json "some { string }" %>
  def json(value)
    raw value.to_json
  end 
end

Так что теперь я могу писать шаблоны как

{
  "html": <%=json render_html(:partial => 'some_partial') %>,
  "status": success
}

Это было бы лучше, если бы actionview разрешал рендеринг с типом content_type, как в примере 23tux (у меня это не работает). Также было бы лучше, если бы только * .html.erb подвергался экранированию html вместо всех файлов * .erb.

2 голосов
/ 13 августа 2013

Для будущих читателей вы можете передать параметр форматов следующим образом.

= render partial: 'user', locals: {xyz: @xyz}, :formats => [:html]
0 голосов
/ 23 марта 2011

Я не уверен, правильно ли я вас понял, но, возможно, вы можете поиграть с таким типом контента:

disclaimer = {
  "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer', :content_type => 'text/html'), :locals => {:localVariable => @localVariable} %>"
}

: localals - это просто, если вы хотите передать переменную в частичное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...