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'
도 도움이되지 않습니다.
render : partial을 호출 할 때 Rails 3.2.3부터 시작합니다 ( respond_to
블록 외부에서만 작동 ).
:formats => [:html]
대신에
:format => 'html'
무슨 일이야
render :partial => '/foo/baz.html.erb'
? 방금 Atom 빌더 템플릿 내부에서 HTML ERB를 부분적으로 렌더링하려고 시도했지만 정상적으로 작동했습니다. 전역 변수가 필요하지 않습니다 (예, 변수 앞에 "@"가 있다는 것을 알고 있지만 그것이 그 것입니다).
당신의 with_format &block
접근 방식은 그래도 멋지다, 잘 같은 간단한 방법이 템플릿 엔진을 지정하는 반면 만, 형식을 지정하는 장점 (ERB / 빌더 / 등)이있다.
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 %>
An alternate solution would be to redefine render
to accept a :format
parameter.
I couldn't get render :file
to work with locals and without some path wonkiness.
In Rails 3, the View has a formats array, which means you can set it to look for [:mobile, :html]. Setting that will default to looking for :mobile templates, but fall back to :html templates. The effects of setting this will cascade down into inner partials.
The best, but still flawed way, that I could find to set this was to put this line at the top of each full mobile template (but not partials).
<% self.formats = [:mobile, :html] %>
The flaw is that you have to add that line to multiple templates. If anyone knows a way to set this once, from application_controller.rb, I'd love to know it. Unfortunately, it doesn't work to add that line to your mobile layout, because the templates are rendered before the layout.
Just elaborating on what zgchurch wrote:
- taking exceptions into account
- returning the result of the called block
Thought it might be useful.
def with_format(format, &block)
old_formats = formats
begin
self.formats = [format]
return block.call
ensure
self.formats = old_formats
end
end
You have two options:
1) use render :file
render :file => "foo/_baz.json.erb"
2) change template format to html by setting @template_format variable
<% @template_format = "html" %>
<%= h render(:partial => '/foo/baz') %>
I had a file named 'api/item.rabl' and I wanted to render it from an HTML view so I had to use:
render file: 'api/item', formats: [:json]
(file
because the file have no underscore in the name, formats
and not format
(and passes and array))
It seems that passing a formats
option will render it properly in newer Rails version, at least 3.2:
{
someKey: 'some value',
someHTML: "<%= h render('baz', formats: :html) -%>"
}
I came across this thread when I was trying to render an XML partial in another xml.builder view file. Following is a nice way to do it
xml.items :type => "array" do
@items.each do |item|
xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item })
end
end
And yeah... Full file name works here as well...
참고URL : https://stackoverflow.com/questions/339130/how-do-i-render-a-partial-of-a-different-format-in-rails
'program tip' 카테고리의 다른 글
왜 파이썬 클래스에서 __init__를 사용합니까? (0) | 2020.07.26 |
---|---|
쉘을 사용하여 PostgreSQL에 데이터베이스가 있는지 확인하십시오. (0) | 2020.07.26 |
쉘 스크립트의 연관 배열 (0) | 2020.07.26 |
setuptools / distribute에 패키지 데이터를 포함시키는 방법은 무엇입니까? (0) | 2020.07.26 |
페이드 효과가있는 요소 추가 [jQuery] (0) | 2020.07.26 |