부분 렌더링과 관련하여 Rails “마법”을 이해합니다.
이것이 작동하는 이유 :
<%= render "rabbits/form" %>
그리고이 작품 :
<%= render "rabbits/form", :parent => @warren, :flash => flash %>
그러나 이것은 작동하지 않습니다 .
<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>
그러나 이것은 다음을 수행합니다.
<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>
또한 사람들을 귀찮게 할 필요가 없도록 이러한 뉘앙스를 어떻게 찾을 수 있습니까?
답변
간단한 대답은 render 메서드가 전달한 첫 번째 인수를 보는 것입니다. 해시 (포함 :partial => 'foo', :locals => {blah blah blah}
)를 전달하면 모든 인수를 해시로 전달하고 그에 따라 구문 분석합니다.
첫 번째 인수로 문자열을 전달하면 첫 번째 인수가 부분 이름이라고 가정하고 나머지는 로컬로 전달합니다. 그러나, 후속 호출에, 실제로 할당 :locals => your_locals_argument
이 경우 전체 인 :locals => {locals hash}
대신에, {locals hash}
; 즉 :locals => {:locals => {locals hash}}
, 대신 :locals => {locals hash}
.
따라서 제 조언은 항상 항상 같은 방식으로 값을 명시 적으로 전달하는 것입니다. 그러면 문제가 발생하지 않습니다. 이에 대해 알아보기 위해 코드 자체 ( actionpack / lib / base.rb ,render()
Rails 2의 메소드, Rails 3은 다릅니다). 좋은 운동입니다.
또한 사람들을 “괴롭히는”것에 대해 걱정하지 마십시오. 이것이이 사이트가 존재하는 이유입니다. 나는 이것으로부터 무언가를 배웠다.
답변
: locals를 지정해야하는 경우 : partial 또는 : template을 지정해야합니다.
<%= render :partial => "rabbits/form", :locals => {...} %>
작동해야
답변
솔직히 말해서 저는 지난 2 년 동안 Rails를 따라 왔고 새로운 방법이 추가되었다는 발표를 읽었 기 때문에 이러한 사용 사례에 대해서만 알고 있습니다. 나는 종종 스스로 실수를하지만 보통 쉽게 고쳐진다.
저에게 물어 보면 철저하게 생각하지 않은 Rails API 부분 중 하나입니다. 그것은 오래된 행동을 비난하지 않고 수년 동안 점점 더 많은 구문 설탕을 축적했습니다. 렌더링 방법에는 당뇨병이 있습니다.
설상가상으로 렌더는 컨트롤러와 뷰에서 다르게 작동합니다. 또한 첫 번째 인수의 내용을 살펴보고 파일, 템플릿, 작업 또는 부분인지 확인합니다. 슬래시로 시작하면 파일 또는 이와 유사한 것입니다.
가능한 한 더 짧은 표기법을 사용하는 것을 선호합니다. 짧은 표기법이 의도를 잘 전달하기 때문입니다. 그것을 읽을 때 보통 당신이 생각하는대로한다. 부분 작성은 간단하지 않습니다.
답변
다음은 http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render 의 렌더링 메소드 소스입니다 .
def render(options = {}, locals = {}, &block)
case options
# Here is your last case
when Hash
if block_given?
_render_partial(options.merge(:partial => options.delete(:layout)), &block)
elsif options.key?(:partial)
_render_partial(options)
else
template = _determine_template(options)
lookup_context.freeze_formats(template.formats, true)
_render_template(template, options[:layout], options)
end
when :update
update_page(&block)
else
# here the first three cases
_render_partial(:partial => options, :locals => locals)
end
end
이 도움을 바랍니다!
답변
