일부 HTML을 포함하는 JSON 응답을 생성하려고합니다. 따라서 나는 /app/views/foo/bar.json.erb
:
{
someKey: 'some value',
someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}
렌더링 /app/views/foo/_baz.html.erb
하고 싶지만 렌더링 만합니다 /app/views/foo/_baz.json.erb
. 합격 :format => 'html'
은 도움이되지 않습니다.
답변
Rails 3.2.3부터 render : partial을 호출 할 때 ( respond_to
블록 외부에서만 작동합니다 ).
render formats: [ :html ]
대신에
render format: 'html'
답변
뭐가 잘못 됐니
render :partial => '/foo/baz.html.erb'
? Atom 빌더 템플릿 내부에서 HTML ERB 부분을 렌더링하기 위해 이것을 시도했지만 제대로 작동했습니다. 전역 변수가 필요하지 않습니다. (예, 앞에 “@”가 있다는 것을 알고 있지만 그게 바로 그 것입니다).
귀하의 with_format &block
접근 방식 은 멋지고 형식 만 지정하는 반면 간단한 접근 방식은 템플릿 엔진 (ERB / builder / etc)도 지정한다는 장점이 있습니다.
답변
Rails 3의 경우 with_format 블록이 작동하지만 약간 다릅니다.
def with_format(format, &block)
old_formats = formats
self.formats = [format]
block.call
self.formats = old_formats
nil
end
답변
Rails 4에서는 형식 매개 변수를 전달할 수 있습니다. 그래서 당신은 할 수 있습니다
render(:partial => 'form', :formats => [:html])}
Rails 3에서 비슷한 작업을 할 수 있지만 해당 형식을 하위 부분에 전달하지 않습니다 (양식이 다른 부분을 호출하는 경우).
config / initializers / renderer.rb를 생성하여 Rails 3에서 Rails 4 기능을 사용할 수 있습니다.
class ActionView::PartialRenderer
private
def setup_with_formats(context, options, block)
formats = Array(options[:formats])
@lookup_context.formats = formats | @lookup_context.formats
setup_without_formats(context, options, block)
end
alias_method_chain :setup, :formats
end
http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific-format/ 참조
답변
roninek의 응답 을 바탕으로 다음과 같은 최상의 솔루션을 찾았습니다.
/app/helpers/application.rb에서 :
def with_format(format, &block)
old_format = @template_format
@template_format = format
result = block.call
@template_format = old_format
return result
end
/app/views/foo/bar.json에서 :
<% with_format('html') do %>
<%= h render(:partial => '/foo/baz') %>
<% end %>
대체 솔루션은 매개 변수 render
를 승인 하도록 재정의 하는 것 :format
입니다.
나는 render :file
현지인들과 일할 수 없었고 어떤 경로가 없어도 일할 수 없었 습니다.
답변
Rails 3에서 View에는 형식 배열이 있습니다. 즉, [: mobile, : html]을 찾도록 설정할 수 있습니다. 기본적으로 : mobile 템플릿을 찾도록 설정하지만 : html 템플릿으로 돌아갑니다. 이 설정의 효과는 내부 부분으로 계단식으로 내려갑니다.
이것을 설정하기 위해 찾을 수있는 최선이지만 여전히 결함이있는 방법은이 줄을 각 전체 모바일 템플릿의 상단에 배치하는 것입니다 (부분이 아님).
<% self.formats = [:mobile, :html] %>
결함은 여러 템플릿에 해당 라인을 추가해야한다는 것입니다. 누군가 application_controller.rb에서 이것을 한 번 설정하는 방법을 알고 있다면 그것을 알고 싶습니다. 안타깝게도 템플릿이 레이아웃보다 먼저 렌더링되기 때문에 모바일 레이아웃에 해당 줄을 추가하는 것은 작동하지 않습니다.
답변
zgchurch가 작성한 것에 대해 자세히 설명합니다.
- 예외를 고려
- 호출 된 블록의 결과 반환
유용 할 것이라고 생각했습니다.
def with_format(format, &block)
old_formats = formats
begin
self.formats = [format]
return block.call
ensure
self.formats = old_formats
end
end