2016-10-06 75 views
0

我無法訪問我的實例變量。我的代碼如下:如何在我的部分中訪問我的實例變量

# controllers/locations_controller.rb 
def index 
    if request.xhr? 
    neLat = data.dig('northeast', 'lat').to_f 
    neLng = data.dig('northeast', 'lng').to_f 
    swLat = data.dig('southwest', 'lat').to_f 
    swLng = data.dig('southwest', 'lng').to_f 

    @markers = Location 
     .where("lat <= ?", neLat) 
     .where("lng <= ?", neLng) 
     .where("lat >= ?", swLat) 
     .where("lng >= ?", swLng) 
    end 

    respond_to do |format| 
    format.html 
    format.json {render :json => @markers} 
    format.js 
    end 
end 


# view/locations/_map.html.erb 
$.ajax({ 
    url: '/location.json', 
    type: 'GET', 
    contentType: "application/json; charset=utf-8", 
    data: { 
    "northeast": bounds.getNorthEast().toJSON(), 
    "southwest": bounds.getSouthWest().toJSON(), 
    } 
}) 
.done(function(data) { 
    // EDIT HERE 
    console.log(data) 
    console.log(<%= @markers %>) 
    // END OF EDIT 
    $('.results').html("<%= j render 'locations/location_results' %>") 
}); 

當我CONSOLE.LOG(數據)後,我的阿賈克斯已經成功地完成我得到我預期的結果,但是當我CONSOLE.LOG(<%= @markers%>)我得到空的結果。我如何可以訪問我的實例變量\

編輯:

所以我最終從我的控制器傳遞一個哈希我的看法是這樣的:

# controller 
renderPartial = render_to_string :partial => 'locations/location_results.html.erb' 
respond_to do |format| 
    format.html   
    format.json {render :json => {markers: @markers, partial: renderPartial}} 
end 

# view 
.done(function(data) { 
    if (data) { 
    $('.results').html(data.partial) 
    return addMarkers(data.props) 
    } 
}) 

這讓我使我的部分並可以使用erb訪問我的實例變量,並在javascript中使用回調變量。

+0

你在哪裏記錄實例var?我沒有看到你的代碼? –

+0

@PamioSolanky - 我已經更新了我的代碼。我在我的.done方法中記錄我的數據 – ManeOfThrones

回答

0

所以我最終從我的控制器傳遞一個哈希我的看法是這樣的:

# controller 
renderPartial = render_to_string :partial => 'locations/location_results.html.erb' 
respond_to do |format| 
    format.html   
    format.json {render :json => {markers: @markers, partial: renderPartial}} 
end 

# view 
.done(function(data) { 
    if (data) { 
    $('.results').html(data.partial) 
    return addMarkers(data.props) 
    } 
}) 

這讓我渲染我的部分,並與erb訪問我的實例變量,並在javascript中使用回調變量。

0

我不認爲你可以用當前的代碼。 您的jQuery ajax超出上下文範圍,即您正在從客戶端發出ajax,並且服務器使用=>format.json {render :json => @markers}返回一些數據,因此從您服務器返回的數據將在您完成回調後供您使用,就像您已完成的那樣。

有兩件事情你可以做

  1. 渲染從你的行動部分,將有機會獲得實例變量

    def index 
        # Logic here 
        render :partial => "locations/location_results" 
    end 
    
  2. 或者你也可以創建你希望每個格式圖以支持

    def index 
        # Logic goes here 
    end 
    # Create a file with js extension in your views folder of the corresponding controller 
    # index.js.erb 
    # index.html.erb 
    # etc 
    

    當你這樣做時,rails會嘗試渲染用相應的請求格式查看視圖。所以,如果請求的類型爲js,那麼它就會呈現index.js.erb

而在你的index.js.erb你可以這樣做console.log('<%= @markers %>')。基本上你可以在這個文件中編寫javascript來操縱你的html。例如,在index.js.erb我也能做到這一點

$('.results').html("<%= j render 'locations/location_results' %>") 
    console.log('<%= @markers %>') 

希望幫助:)

+0

我很困惑你的第二個解決方案。我不太明白我將如何實現這一點。至於第一種解決方案,我不知道這是否適用於我,因爲我想渲染和重新渲染部分(位於頁面的一半),而另一半需要顯示更多信息太。 – ManeOfThrones

+0

你可以在視圖中渲染部分圖像嗎?答案清楚地描述瞭如何在你的'index.js.erb'文件中呈現一個部分。你可以渲染任何數量的部分。 –