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


99

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

또한 사람들을 귀찮게 할 필요가 없도록 이러한 뉘앙스를 어떻게 찾을 수 있습니까?


3
아래 댓글에서 rails api 문서는 검색 할 수 없다고 말하고 있습니다. 대신이 사이트를 시도해야합니다 : apidock.com/rails . 또한 거기에 루비와 rspec이 있습니다.
ryeguy 2010

답변:


152

간단한 대답은 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은 다릅니다). 좋은 운동입니다.

또한 사람들을 "괴롭히는"것에 대해 걱정하지 마십시오. 이것이이 사이트가 존재하는 이유입니다. 나는 이것으로부터 무언가를 배웠다.


5

: locals를 지정해야하는 경우 : partial 또는 : template을 지정해야합니다.

<%= render :partial => "rabbits/form", :locals => {...} %>

작동해야


호기심이 생기면 루비가 해시를 평가하는 방식과 관련이 있습니다.
sethvargo 2010

실제로 그것은 작동합니다 .. 내가 내 질문에 지정한대로 ...하지만 내가 궁금한 것은 이유무엇입니까? 이 문서는 어디에 있습니까? 출처 만 보면? 그리고 그것이 Rails의 수많은 뉘앙스를 찾고 이해하는 유일한 방법이라면 소스에서 이것을 찾고 해석 하는 방법위치 가 궁금 합니다 . "렌더링"을 클릭 한 다음 소스로 드릴 다운 할 수 없습니다 (어쨌든 TextMate를 사용하지 않음). 아니면 할 수 있습니까?
Meltemi

1
아! 그래서 당신은 실제로 관심이 있습니다 :). 예, 이러한 것들을 파악하는 유일한 방법은 a.) 당신이했던 것처럼 직감하고 b.) 소스 코드를 보는 것입니다. 나는 소스하지만 ... 죄송합니다 드릴 다운하는 방법을 몰라
sethvargo

좋아, 내가 어떻게 ... 물린 것이다 당신이 이런 종류의 물건을 찾아? 당신은 당신을 파헤 치 clone https://github.com/rails/rails.git십니까? 아니면 더 좋은 방법이 있습니까? 하지만 미안 RoR에 비교적 새로운 해요 아직 레일 문서를 조회 할 수 ...이되도록 좋은 / 쉽게 / 일관성있게 발견하지 않았습니다 입니다 어느. 쉽게 검색 http://api.rubyonrails.org/없습니다 . 와 자식의 소스는 ... 하나없는 한숨
멜 테미

전문가는 아니지만 Aptana 스튜디오를 사용합니다. eclipse와 동일한 플랫폼에 구축되었습니다 (익숙한 경우). 그것은 당신이 말한 것처럼 "클릭"하고 추적 할 수 있습니다. 당신은 또한 코드 내 검색을 할 수 있고 그것은 터미널 등을 내장하고 있습니다.주의 – 그것의 꽤 큰 파일
sethvargo dec

2

솔직히 말해서 저는 지난 2 년 동안 Rails를 따라 왔고 새로운 방법이 추가되었다는 발표를 읽었 기 때문에 이러한 사용 사례에 대해서만 알고 있습니다. 나는 종종 스스로 실수를하지만 보통 쉽게 고쳐진다.

저에게 물어 보면 철저하게 생각하지 않은 Rails API 부분 중 하나입니다. 그것은 오래된 행동을 비난하지 않고 수년 동안 점점 더 많은 구문 설탕을 축적했습니다. 렌더링 방법에는 당뇨병이 있습니다.

설상가상으로 렌더는 컨트롤러와 뷰에서 다르게 작동합니다. 또한 첫 번째 인수의 내용을 살펴보고 파일, 템플릿, 작업 또는 부분인지 확인합니다. 슬래시로 시작하면 파일 또는 이와 유사한 것입니다.

가능한 한 더 짧은 표기법을 사용하는 것을 선호합니다. 짧은 표기법이 의도를 잘 전달하기 때문입니다. 그것을 읽을 때 보통 당신이 생각하는대로한다. 부분 작성은 간단하지 않습니다.


1

다음은 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

이 도움을 바랍니다!


이것은 도움이됩니다 , 감사합니다! 그러나 그것은하지 않습니다 도움이 날 ... 자신을 도울 당신은 내가 ... 무슨 뜻인지 알고있는 경우
멜 테미
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.