1

我正在尝试构建一个非常简单的页面,我需要在其中为照片库生成一些动态 JavaScript。一些直观简单的东西,但我正在努力解决这个问题。在我的控制器中,我正在构建一个Photoas列表@photos,然后需要为我的photo.js.erb文件中的每张照片迭代出一些 JavaScript。

但是,每当我到达我的 .js.erb 文件时,@photos变量就会变为 nil ......我错过了什么?

控制器/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'

javascripts/photos.js.erb文件:

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

我知道这个问题已经被问过十几次了,但以前接受的答案都没有真正对我有用。非常感谢任何建议。

4

1 回答 1

3

您需要向服务器发送 js 请求才能访问实例变量。像这样的东西

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

});

在 views/photos/category.js.erb 文件中:

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

或者你可以使用gon gem 来做同样的事情。

app/views/layouts/application.html.erb

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

你把这样的东西放在你的控制器的动作中:

@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 {}

从您的 JavaScript 文件访问变量:

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

希望这可以帮助

于 2013-03-04T12:56:19.477 回答