복붙노트

[RUBY-ON-RAILS] 어떻게 레일에서 다른 형식의 부분을 렌더링합니까?

RUBY-ON-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 렌더링됩니다. 전달 : 형식 => 'HTML'하는 것은 도움이되지 않습니다.

해결법

  1. ==============================

    1.레일 3.2.3,부터 렌더링 호출 할 때 : 부분 (만 respond_to 블록의 외부에서 작동).

    레일 3.2.3,부터 렌더링 호출 할 때 : 부분 (만 respond_to 블록의 외부에서 작동).

    :formats => [:html]
    

    대신에

    :format => 'html'
    
  2. ==============================

    2.문제점은 무엇입니까

    문제점은 무엇입니까

    render :partial => '/foo/baz.html.erb'
    

    ? 난 그냥 아톰 빌더 템플릿 내부에서 부분의 HTML ERB 렌더링이를 시도하고 벌금을했다. 더 필요한 전역 변수와 장난 없다 (그들의 앞에 그래, 나는 그들이 알고 "@"하지만, 그의는 무엇입니까).

    귀하의 with_format 및 블록 접근하지만 시원하고,뿐만 아니라 간단한 방법은 템플릿 엔진을 지정하는 반면 만, 형식을 지정하는 장점 (ERB / ​​빌더 / 등)이있다.

  3. ==============================

    3.레일 3의 경우, with_format 블록은 작동하지만 조금 다르다 :

    레일 3의 경우, with_format 블록은 작동하지만 조금 다르다 :

      def with_format(format, &block)
        old_formats = formats
        self.formats = [format]
        block.call
        self.formats = old_formats
        nil
      end
    
  4. ==============================

    4.당신이 형식 매개 변수를 전달 할 수 있도록 4 레일. 당신은 할 수 있습니다

    당신이 형식 매개 변수를 전달 할 수 있도록 4 레일. 당신은 할 수 있습니다

    render(:partial => 'form', :formats => [:html])} 
    

    당신이 레일 3에서 비슷한 일을 할 수 있습니다 만 (형태가 다른 부분 지문을 호출하는 경우)는 하위의 파셜에 해당 형식을 통과하지 않을 것입니다.

    당신은 설정 / 초기화 / renderer.rb 작성하여 레일을 레일 3 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/ 참조

  5. ==============================

    5.roninek의 응답에 구축, 나는 다음으로 최선의 해결책을 발견했습니다 :

    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 %>
    

    형식 매개 변수 : 대체 솔루션은 동의 렌더링 다시 정의하는 것입니다.

    나는 렌더링되지 수 : 작업에 파일을 지역 주민과 함께 어떤 경로 wonkiness없이.

  6. ==============================

    6.[HTML : 모바일] 레일 3에서보기는 당신이보고 설정할 수 있습니다 의미 형식의 배열을 가지고 있습니다. 이 설정을 찾고로 기본 설정됩니다 : 모바일 템플릿, 그러나 다시 가을 : HTML 템플릿. 이러한 설정에 따른 결과는 파셜 내부 아래로 연쇄된다.

    [HTML : 모바일] 레일 3에서보기는 당신이보고 설정할 수 있습니다 의미 형식의 배열을 가지고 있습니다. 이 설정을 찾고로 기본 설정됩니다 : 모바일 템플릿, 그러나 다시 가을 : HTML 템플릿. 이러한 설정에 따른 결과는 파셜 내부 아래로 연쇄된다.

    나는이 설정 찾을 수있는 가장 좋은,하지만 여전히 결함이 방법은 각각 전체 모바일 템플릿 (하지만 부분 지문)의 상단에이 줄을 추가하는 것이 었습니다.

    <% self.formats = [:mobile, :html] %>
    

    결함은 여러 템플릿이 줄을 추가해야한다는 것입니다. 사람이 application_controller.rb에서, 한번을 설정하는 방법을 알고 있다면, 나는 그것을 알고 싶네요. 불행히도, 템플릿 레이아웃 전에 렌더링되기 때문에, 모바일 레이아웃이 줄을 추가 작동하지 않습니다.

  7. ==============================

    7.그냥 쓴 zgchurch 무엇을 정교화 :

    그냥 쓴 zgchurch 무엇을 정교화 :

    이 유용 할 수 있습니다 생각.

    def with_format(format, &block)
      old_formats = formats
      begin
        self.formats = [format]
        return block.call
      ensure
        self.formats = old_formats
      end
    end
    
  8. ==============================

    8.당신은 두 가지 옵션이 있습니다 :

    당신은 두 가지 옵션이 있습니다 :

    1) 렌더링 사용 : 파일을

    render :file => "foo/_baz.json.erb"
    

    가변 @template_format 설정하여 HTML 2) 변경 템플릿 형식

    <% @template_format = "html" %>
    <%= h render(:partial => '/foo/baz') %>
    
  9. ==============================

    9.나는 'API / item.rabl'라는 이름의 파일을했고, 내가 사용했다, 그래서 나는 HTML 뷰에서 렌더링하고 싶었 :

    나는 'API / item.rabl'라는 이름의 파일을했고, 내가 사용했다, 그래서 나는 HTML 뷰에서 렌더링하고 싶었 :

    파일을 렌더링 : 'API / 아이템', 형식 : [: JSON]

    (파일은 파일 이름에 밑줄이 없기 때문에, 형식이 아닌 형식 (그리고 패스와 배열))

  10. ==============================

    10.형식 옵션을 전달하는 것은 적어도 3.2, 제대로 새로운 레일 버전을 렌더링 할 것으로 보인다 :

    형식 옵션을 전달하는 것은 적어도 3.2, 제대로 새로운 레일 버전을 렌더링 할 것으로 보인다 :

    {
      someKey: 'some value',
      someHTML: "<%= h render('baz', formats: :html) -%>"
    }
    
  11. ==============================

    11.나는 다른 xml.builder보기 파일의 부분은 XML을 렌더링하기 위해 노력했다 스레드를 건너 왔어요. 그것을 할 수있는 좋은 방법입니다 다음

    나는 다른 xml.builder보기 파일의 부분은 XML을 렌더링하기 위해 노력했다 스레드를 건너 왔어요. 그것을 할 수있는 좋은 방법입니다 다음

    xml.items :type => "array" do
        @items.each do |item|
            xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item })
        end
    end
    

    그리고 그래 ... 전체 파일 이름뿐만 아니라 여기서 일하는 ...

  12. from https://stackoverflow.com/questions/339130/how-do-i-render-a-partial-of-a-different-format-in-rails by cc-by-sa and MIT license