[ruby-on-rails] Rails에서 다른 형식의 일부를 어떻게 렌더링합니까?

일부 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