2011-11-27 3 views
1

에서 내 routes.rb이 설정 :사용자 정의 렌더링을 강제 실행하는 방법은 무엇입니까?

다음

TvShowsController에 :

xml.instruct! 
xml.title "Test" 

:

def dump 
    render :dump 
end 

을 그럼,이 콘텐츠와 함께 views/tv_shows 디렉토리에 dump.xml.builder라는 이름의 파일을 추가 내가 curl http://server/xml/xyz 할 때 나는 이것을 얻는다 :

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

그리고 레일 서버 출력은 다음과 같습니다 제가 XML을 얻기 위해 웹 브라우저를 사용할 때

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) 

문제입니다; 그것은 말한다 : Missing template tv_shows/dump 및 레일 서버 출력은 다음과 같습니다

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) 

지금까지 내가 아는 한, 내가 지금 왜 HTML로 렌더링하려고 않습니다 ... 항상 :dump를 사용하여 뷰를 렌더링하기 위해 루비를 말하는 거죠?

답변

0

레일에는 'Content Negotiation'이라는 기능이 있습니다.

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

레일 뷰를 렌더링하는 템플릿을 해당 찾습니다 : 당신은 당신이 respond_to 방법을 통해 제공 할 수있는 형식으로 레일을 알려야합니다. curl은 xml을 허용하는 send accept 헤더를 가지고 있어야합니다. 따라서 레일스는 자동으로 XML을 렌더링하고 전송합니다. params[:format]을 지정하여 /dump/xyz.xml과 같은 강제 요청 지정 형식으로 설정할 수 있습니다. 당신이 사용하는 경우 반면에

def dump 
    render "dump.xml" 
end 

: 나는이 방법은 XML 렌더러를 강제 할 수 있다고 생각

match 'dump/:prefix(.:format)' => 'TvShows#dump' 
+0

나는 HTML에 응답하고 싶지 않다. 그래서 나는'respond_to'를 추가하지 않았다. 또한 URL에 어떤 확장명을 지정했는지에 관계없이 XML을 반환하려고합니다. 나는'/ dump/xyz'가 XML을 반환하기를 원한다. – Cristian

+0

해결책이 있습니까? – DrewBaumann

2

이렇게하려면에 대한 경로를 변경

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

당신 "dump.xml"을 묻는 경우 XML이 반환되고 다른 경우에는 아무것도 반환되지 않습니다.

+0

나는 또 다른 문제가 있었지만, 당신의 대답은 나에게 약간의 생각을주었습니다. 고맙습니다. 'if request.xhr? render : partial => "forms/some_form.html.erb", layout : false end' 이제 xhr 요청에 대해 HTML 응답을 적용 할 수있었습니다. – suhovius

1

xml 응답을 강제하려면 before_filter 안에 요청 형식을 설정하십시오.

class ApplicationController < ActionController::Base 
    before_filter :set_xml_format 

    def set_xml_format 
    request.format = :xml 
    end 
end 
관련 문제