Встраивание серверных Ruby в файлы опалов в рельсах
Можно ли встраивать серверный рубин в файлы Opal .js.rb? Другими словами мне нужен доступ к примеру User.find(1)
в каком-то опаловом файле в Rails, как в случае с.erb.
2 ответа
Работает как это из коробки в Reactive-Record. В противном случае вам нужно создать какой-то API-интерфейс между механизмом предварительной визуализации client + v8 и сервером, чтобы получить данные (что и делает реагирующая запись). Вы можете посмотреть на код реактивной записи и реактивной записи в файлах, помеченных как "isomorphic..."Дополнительную информацию смотрите в файле readme для React.rb React-Ruby.
Похоже, вы ищете способ передачи данных клиенту в первоначальном запросе. Если вы загружаете данные в серверное приложение и просто хотите передать их, вы можете посмотреть в gon
драгоценный камень.
TL; версия DR
Здесь достаточно, чтобы ваши ноги промокли
# Gemfile
gem 'gon'
# app/controllers/my_controller.rb
class MyController < ApplicationController
before_action { gon.push current_user: User.find(session[:user_id]) }
end
# app/views/layouts/application.html.erb
<head>
<%= include_gon %>
</head>
# app/assets/javascripts/application.rb
require 'native' # To be able to convert JS objects to hashes.
current_user = User.new(Hash.new(`gon.current_user`))
Объяснение:
gon
gem устанавливает хеш, который будет объективизирован JS и помещен в вашу среду выполнения JS в браузере. Для получения дополнительной информации об этом см. Railscast (он все еще в основном актуален, мало что изменилось).
В браузере этот объект JS также называется gon
, так gon.current_user
будет то, что вы поставили gon.push current_user: some_user
в действии контроллера (или обратного вызова before_action).
Но нам нужно преобразовать это из объекта JS в хеш Ruby, используя Hash.new(gon.current_user)
то вы можете передать полученный хеш User.new
вызов.
Важная часть: вам нужно иметь User
класс в вашем приложении Opal. Если ваше приложение Rails настроено User
Модель ActiveRecord, вы не сможете использовать ее повторно, поэтому вам нужно будет создать новую, но если это просто PORO (обычный старый объект Ruby), вы можете добавить следующую строку в инициализатор:
Opal.append_path Rails.root.join('app', 'shared')
Затем вы можете поместить нужный код Ruby как в приложение Rails, так и в приложение Opal в app/shared
, Например, вы можете сделать это в app/shared/user.rb
:
class User
attr_reader :id, :name, :email
def initialize(attributes={})
attributes.each do |attr, value|
instance_variable_set "@#{attr}", value
end
end
end