Rails: передать данные в javascript

Я новичок в Rails и в контроллере у меня есть:

class PagesController < ApplicationController
   def home
      @temp = "Hello"
   end
end

Я прочитал, что я должен поместить код javascript в application.js(скажите, если это правда), и у меня есть:

window.onload=function(){alert("<%= j @temp %>")}

Очевидно, что предупреждение выводит строку "<% = j @temp% > " Как передать переменную @temp в javascript, чтобы предупреждение могло печатать Hello?

Спасибо

Ответы

Ответ 1

Я написал статью о как передать объекты Ruby клиенту. Ryan Bates также имеет отличный RailsCast для передачи данных в JS.

Добавьте div к вашему представлению, который соответствует вашему действию на странице PagesControlle #, которое не будет отображаться при загрузке страницы, но будет содержать данные, хранящиеся в объектах Ruby:

# views/pages_controllers/home.html.erb
<%= content_tag :div, class: "temp_information", data: {temp: @temp} do %>
<% end %>

Загрузите страницу с включенным div и просмотрите источник страницы. Вы можете увидеть свои объекты Ruby, хранящиеся в div .temp_information. Откройте консоль JavaScript для доступа к объектам Ruby как объекты JavaScript:

$('.temp_information').data('temp')

Вам не нужно добавлять JS в частичное JS, вы также можете использовать конвейер активов.

Ответ 2

Я делаю что-то похожее, но проще, чем gon. В моем ApplicationController у меня есть следующее.

def javascript_variables(variables)
  @javascript_variables ||= {}
  @javascript_variables.merge!(variables)
end

В рамках действия контроллера я могу сделать что-то вроде

def some_action
  javascript_variables(user: current_user)
end

В моем ApplicationHelper у меня есть что-то вроде этого

def javascript_variables(variables = nil)
  @javascript_variables ||= {}
  @javascript_variables.merge!(variables) and return if !variables.nil?

  output  = ''
  padding = @javascript_variables.keys.group_by(&:size).max.first

  @javascript_variables.each do |variable, value|
    output << "#{variable.to_s.ljust(padding)} = #{value.to_json},\n          "
  end

  raw "var " + output.strip.html_safe.gsub(/\,\Z/m, ';')
end

и, наконец, в моем макете <head> У меня

<script>
  <%= javascript_variables %>
</script>

Это дает мне что-то вроде этого (из реального примера в моем приложении)

<script>
  var pageModule        = "site/index",
      isCustomer        = false,
      utype             = "normal",
      isAnonymous       = true,
      keyboardShortcuts = false,
      pubnub            = null,
      requestToken      = "3zj974w074ftria3j";
</script>

Ответ 3

Взгляните на это.

http://tech.thereq.com/post/17243732577/rails-3-using-link-to-remote-true-with-jquery-ujs

Один из самых простых способов - использовать файл js.erb, где вы можете делать рубиновые теги для доступа к переменным, определенным в действии контроллера.

Вам нужно использовать блок response_to в действии контроллера, указав действие, чтобы иметь возможность отвечать на javascript.

items_controller.rb

class ItemsController < ApplicationController

  def action
    respond_to do |format|
      format.js
      #format.html {}    #  These are for allowing other types of formats to be responded to.
      #format.json {}    #  But they are not necessary for using this js.erb way of doing things.
    end
  end

end

/views/items/action.js.erb

$(div).html('The cat has erased your page');