Получение «Шаблон отсутствует» при использовании XmlMarkup Builder в Rails - PullRequest
0 голосов
/ 10 декабря 2011

Я изучаю Rails и пытаюсь получить вывод XML моего обновления ActiveRecord.Это мой routes.rb:

Sparklizer::Application.routes.draw do
  resources :updates
  get "updates/new"
  get "updates/list"
  get "home/index"
  match "updates/xml/:id" => "updates#xmlOut"
end

match "updates/xml/:id" => "updates#xmlOut", где я пытаюсь вывести XML.Это метод xmlOut:

def xmlOut
        render :layout => false

        headers['Content-Type'] = 'application/xml'
        @xml = Builder::XmlMarkup.new
        @update = Update.find(params[:id])
        xml.instruct!  :xml, :version=> "1.0"
            xml.declare!  :DOCTYPE, :html,  :PUBLIC, "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"

            xml.update {
                for data in @update
                    xml.data do
                        xml.title(data.title)
                        xml.description(data.description)
                    end
                end
            }
    end

При запуске и доступе к /updates/xml/2 я получаю

Template is missing

Missing template updates/xmlOut, application/xmlOut with {:handlers=>[:erb, :builder, :coffee], :formats=>[:html], :locale=>[:en, :en]}. Searched in: * "/Users/pablo/Documents/Workspace/Sparklizer/app/views"

Что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 10 декабря 2011

Вы пытаетесь визуализировать ваш XML без просмотра файла. Чтобы это работало, вы должны сделать свой XML-файл «встроенным». Из документов :

render :inline => "xml.p {'Horrid coding practice!'}", :type => :builder

Но рендеринг inline считается плохой практикой.

Так что вам лучше использовать конструкцию response_with . Примерно так (отрегулируйте при необходимости):

def xmlOut
  @update = Update.find(params[:id])

  respond_with(@update) do |format|
    format.xml  { render :xml => @update }
  end
end

Существует также railscast , покрывающий это.

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