[ruby-on-rails] Rails : 지역을 부분적으로 전달하는 구문에 대해 혼란 스러움

부분 렌더링과 관련하여 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

이 도움을 바랍니다!


답변