2013-05-02 3 views
31

나는 htmljs에 모두 응답하는 컨트롤러가 있습니다. html보기는 전체 페이지 (머리글과 바닥 글 포함)를 렌더링하는 반면 js#main을 대신합니다. 머리글과 바닥 글을 제외하고 두 형식 모두 동일한 내용을 렌더링합니다. 이 작품레일 : 뷰 렌더링 (일부는 아님) 뷰 내에서

_show.html.erb 
<div>Content!</div> 

show.html.erb 
<%= render "show" %> 

show.js.erb 
$("#main").fadeIn("<%= escape_javascript(render 'show') %>"); 

,하지만 별도의 _show 부분이 필요하지 않은 경우 내가 선호하는 것 : 나는 3 개 파일이 효과를 얻을 수 있습니다. 불행하게도,이 작동하지 않습니다

show.html.erb 
<div>Content!</div> 

show.js.erb 
$("#main").fadeIn("<%= escape_javascript(render 'show') %>"); 

으로 레일이 show 부분이 아닌 실제보기를 찾습니다.

레일스가 부분이 아닌보기 파일을 찾는 방법이 있습니까?

+3

당신이 사용할 수있는': 에프 옵션. ': file => 'show''.렌더 도우미는'render '의 문자열 인수를'render : partial =>'yourview'로 암시 적으로 바꿉니다. 그러나 문제는 js 액션의 lookup 컨텍스트가 js 버전에 대한 "show"를 해결하여 무한 루프 또는 그와 같은 결과를 초래할 수 있다는 것입니다. – numbers1311407

+0

다행히 루프가 돌아 가지 않습니다. 적어도, 아직. 지금은 '누락 된 템플릿'오류가 발생합니다. 그것은 심지어 스스로를 찾을 수없는 것 같습니다. – nullnullnull

+1

다른 뷰 내부에 비 부분 뷰를 렌더링하는 것이 Rails Way ™와 정확하게 일치하지는 않습니다. 현재의 솔루션이 더 좋을 것입니다. 명명에 대해 이상하게 느껴진다면 이름을'_body'로 변경하십시오. 이 시나리오에서 볼 수있는 공통점은'render (@resource)'입니다. 이것은 부분 경로로 바뀝니다. 'resources/_resource'. – numbers1311407

답변

23

다른 뷰 내부의 비 부분 뷰 렌더링은 Rails Way ™와 정확하게 일치하지 않습니다. 현재의 솔루션이 더 좋을 것이고 드문 방식이 아닙니다. 행동과 같은 부분 이름에 대해 이상하게 느껴질 경우 _body 또는 다른 적절한 이름으로 변경하십시오.

그러나보기를 공유 할 수있는 경우이 경우처럼 보이는 것처럼 레이아웃을 만들면됩니다.

js 템플릿이없는 경우 Rails는 js 동작을위한 템플릿을 html 템플릿으로 렌더링한다는 점에서 다소 놀랍습니다. 다른 사람들처럼

# yourviews/show.html.erb 
<div>Content!</div> 

# layouts/fadein.js.erb 
$("#main").fadeIn("<%= escape_javascript(yield) %>"); 

# YourController.rb 
def show 
    # ... 
    respond_to do |wants| 
    wants.html 
    wants.js { render :layout => "fadein" } 
    end 
end 
+3

감사합니다. 이 솔루션은 3 개의 파일 ('show.html.erb','show.js.erb' 및'_show.html.erb')을 하나의'show.html.erb' 파일로 만듭니다. 모델과 액션에 적용 할 수 있으며, 여전히'layouts/fadein.js.erb' 파일 만 있으면됩니다. 훌륭한! – nullnullnull

+0

정말 잘 돌아갔습니다! 정말 고맙습니다. 방금 만든 질문에 양식 제출을 통해 방금 만든 레코드로 리디렉션해야하는 "만들기"시나리오에서이 기능을 사용할 수 없습니다. 나는 remote : true를 form_for에 추가했지만, JS에 대한 respond_to를 레이아웃 JS 파일을 가리 키기는했지만 템플릿을 만든다. 어떤 팁? 감사. – Kopty

+0

@Kopty 여전히 자바 스크립트 레이아웃 안에 HTML로 템플릿을 렌더링하고 있습니다. 그래서 당신이 말하지 않는 한 평소와 같이 템플릿을 만들 것입니다. 쇼 템플릿을 렌더링하고 싶다면'render : show, : layout => "fadein"' – numbers1311407

9

의견으로 볼 수있는 것처럼 좋지 않습니다. 레일즈는 이라는 개념을 가지고 있으며, 부분레이아웃은입니다. 즉, 한 번만 사용해야하는 것은보기입니다. 그래서 내 제안은 : 둘 이상의 추가 뷰가 현재보기의 내부 렌더링 할 수 있다고 판단되는 경우

  1. , 당신은 당신이 당신의보기 중 하나를 느낄 경우 가장 가능성이 레이아웃
  2. 을 찾고해야 많은 페이지를 렌더링 할, 당신이 뷰가 그 안에 하나의 추가 뷰를 렌더링해야하고, 해당 뷰가 현재 뷰에만 내부 렌더링되어야 경우 부분
  3. 를 찾고 있습니다, 당신은 중 하나를 선택할 수 있습니다 또는 해당 항목 없음 - 단일 파일로 이동하십시오.
13

가 언급 한 "또 다른 관점에서가 아닌 다른 부분보기 렌더링 : 이것은 당신이, 예를 들어, fadein.js.erb을 JS 템플릿, 및 부분 모두 제거, 단지 레이아웃 자격 만들 수 있다는 것을 의미 아니 레일 방법은 "당신은 아직도 그 일을 주장하지만 경우, 한 가지 방법은 다음과 같습니다

<%= render :file => '<replace with relative/absolute path>' %> 
1

당신이 당신의 render 방법에 컨텍스트를 전달해야

<%= render :template => "show" -%>