Как заставить пользовательский рендер? - PullRequest
1 голос
/ 27 ноября 2011

В настройках это в моем routes.rb:

match 'dump/:prefix' => 'TvShows#dump'

Затем в TvShowsController:

def dump
  render :dump
end

Затем я добавил файл с именем dump.xml.builder в views/tv_shows каталог с таким содержимым:

xml.instruct!
xml.title "Test"

Когда я делаю curl http://server/xml/xyz, я получаю это:

<?xml version="1.0" encoding="UTF-8"?>
<title>Testing</title>

И вывод сервера rails:

Started GET "/dump/twd" for 127.0.0.1 at 2011-11-26 23:29:28 -0500
  Processing by TvShowsController#dump as */*
  Parameters: {"prefix"=>"twd"}
Rendered tv_shows/dump.xml.builder (0.1ms)
Completed 200 OK in 40ms (Views: 40.0ms | ActiveRecord: 0.0ms)

Проблема в том, что я использую веб-браузер для получения XML;он говорит: Missing template tv_shows/dump и вывод на сервер rails:

Started GET "/dump/twd" for 127.0.0.1 at 2011-11-26 23:29:21 -0500
  Processing by TvShowsController#dump as HTML
  Parameters: {"prefix"=>"twd"}
Completed 500 Internal Server Error in 5ms

ActionView::MissingTemplate (Missing template tv_shows/dump, application/dump with {:handlers=>[:erb, :builder, :coffee], :formats=>[:html], :locale=>[:en, :en]}. Searched in:
  * "/xxxxxx/ruby/pppp/app/views"
):
  app/controllers/tv_shows_controller.rb:25:in `dump'

Rendered /xxxxx/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.4ms)

Насколько я знаю, я говорю Ruby, чтобы он отображал представление всегда, используя :dump ... так почему он пытаетсясделать в HTML?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Я думаю, что вы можете заставить рендер xml следующим образом:

 def dump
   render "dump.xml"
 end

С другой стороны, если вы используете:

  def dump
    respond_to do |format|
      format.xml { render :dump }
    end
  end

Вам будет возвращен XML при запросе "dump.xml "и ничего в других случаях.

1 голос
/ 29 сентября 2013

установить формат запроса внутри before_filter для принудительного ответа xml.

class ApplicationController < ActionController::Base
  before_filter :set_xml_format

  def set_xml_format
    request.format = :xml
  end
end
0 голосов
/ 27 ноября 2011

Rails имеет возможность под названием 'Content Negotiation' .Вы должны указать Rails, какой формат вы можете предоставить, используя метод respond_to:

   class TestController < ApplicationController
     def test
       respond_to do |format|
         format.html 
         format.xml
       end
     end
   end

, тогда rails будет искать соответствующий шаблон для визуализации представления.curl должен иметь заголовок send accept с принимающим xml, чтобы рельсы автоматически отображали и отправляли xml.И вы можете установить params[:format] для принудительного запроса указанного формата, например /dump/xyz.xml.Для этого измените маршрут на:

match 'dump/:prefix(.:format)' => 'TvShows#dump'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...