Встраивание серверных 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
Другие вопросы по тегам