2013-03-04 4 views
1

정말 간단한 페이지를 만들려고합니다. 사진 갤러리 용 동적 JavaScript를 생성해야합니다. 직관적으로 단순하지만, 나는 크게 어려움을 겪고있다. 내 컨트롤러에서 Photo의 목록을 @photos으로 작성한 다음 내 photo.js.erb 파일의 각 사진에 대한 일부 JavaScript를 반복해야합니다.레일 3 : .js.erb 파일에서 인스턴스 변수에 액세스 할 수 없습니다.

그러나 .js.erb 파일에 도달하면 @photos 변수는 0이됩니다. 무엇이 누락 되었습니까?

컨트롤러/photos_controller.rb 파일 :

class PhotosController < ApplicationController 
    layout "application_photos" 
    def category 
    @photos = ...(generates collection of Photos)... 
    end 
end 

보기/사진/category.html.haml 파일 :

= content_for :head do 
    // @photos is still initialized at this point 
    = javascript_include_tag "photos" 

// This partial only loads some more markup, it's inconsequential. 
= render :partial => 'default_slideshow' 

자바 스크립트/photos.js.erb 파일 :

jQuery(function($){ 
    // Throws NilClass error 
    <% puts 'Photos: ' + @photos %> 
}); 

나는이 질문을 12 번이나 받았지만 이전에 받아 들여진 대답 중 실제로 나를 위해 일한 것이 하나도 없다는 것을 알고있다. 어떤 제안이라도 대단히 감사하겠습니다.

+4

이 사실을 기억하십시오 : 자산 파일은 컨트롤러에 선언 된 인스턴스 변수에 액세스 할 수 없습니다. – jvnill

+0

알았어, 잘됐다. 이 문제를 어떻게 해결할 수 있습니까? –

+0

'category.html.haml' 뷰를 만든 다음 페이지의 내용을 jQueryize 할 수 없습니까? JS에서'@ photos'에 정말로 접근해야합니까? 정말로 필요하다면'.js.erb'을 컨트롤러에서 뷰로 렌더링해야 할 것입니다. –

답변

3

인스턴스 변수에 액세스하려면 서버에 js 요청을 보내야합니다. 전경/사진/category.js.erb 파일에서이

$(function($){ 
    $.ajax({ 
    type: "get", 
    url: "..." 
    }) 

}); 

같은 뭔가 :

alert("<%= j @photos %>") 

또는 당신은 gon 보석을 사용하여 동일한 작업을 수행 할 수 있습니다.

<head> 
<title>some title</title> 
<%= include_gon %> 
<!-- include your action js code --> 
... 

app/views/layouts/application.html.erb

당신은 컨트롤러의 동작이 뭔가를 넣어 :

alert(gon.your_int) 
alert(gon.your_other_int) 
alert(gon.your_array) 
alert(gon.your_hash) 

는 희망이

을하는 데 도움이 :

@your_int = 123 
@your_array = [1,2] 
@your_hash = {'a' => 1, 'b' => 2} 
gon.your_int = @your_int 
gon.your_other_int = 345 + gon.your_int 
gon.your_array = @your_array 
gon.your_array << gon.your_int 
gon.your_hash = @your_hash 

gon.all_variables # > {:your_int => 123, :your_other_int => 468, :your_array => [1, 2, 123], :your_hash => {'a' => 1, 'b' => 2}} 
gon.your_array # > [1, 2, 123] 

gon.clear # gon.all_variables now is {} 

액세스 자바 스크립트 파일에서 한다거나 할

+0

나는 전략을 좋아하지만, 구현은 아직 아주 잘 진행되지 않고있다. 'respond_to do | format | '명령을 사용 했음에도 불구하고 해당 category view에 대해'category.js.erb' 파일을 렌더링하지 않는 컨트롤러에서 멈춘다. format.js end'를 카테고리의 컨트롤러 기능에서 사용합니다. 대신 빈 HTML 및 콘솔에서 "HTML로 PhotosController # category 처리"가져옵니다. –

+0

js 호출 코드를 추가하십시오. – benchwarmer

+0

JS를 리턴해야하는 제 'category'뷰로 라우트 된 호출이 헤드에 삽입되지만 대신 406 : Not Acceptable을 리턴합니다. $ (function ($) {$ .ajax ({type : "get", url : "/ photos_js/category/urban"}}));'. 이것은 경로를 직접 호출하는 것과 같은 오류이므로 AJAX에 문제가되지 않습니다. –

관련 문제