サーバー側の Ruby を Opal .js.rb ファイルに埋め込むことは可能ですか? 言い換えればUser.find(1)
、.erb で行うように、Rails の一部の opal ファイルにアクセスする必要があります。
2 に答える
最初のリクエストでクライアントにデータを渡す方法を探しているようです。サーバーアプリにデータをロードして、それを渡したいだけの場合は、gon
gem を調べることができます。
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`))
説明:
gem は、gon
JS オブジェクト化され、ブラウザーの JS ランタイムに配置されるハッシュを設定します。これに関する詳細については、Railscastを参照してください(これはまだほとんど関連性があり、あまり変更されていません)。
ブラウザーでは、その JS オブジェクトにも名前が付けられgon
ているため、コントローラー アクション (または before_action コールバック) でgon.current_user
設定したものになります。gon.push current_user: some_user
しかし、それを を使用して JS オブジェクトから Ruby ハッシュに変換する必要があります。その後、その結果のハッシュを呼び出しHash.new(gon.current_user)
に渡すことができます。User.new
User
重要な部分: Opal アプリにクラスが必要です。Rails アプリで ActiveRecord モデルをセットアップしUser
た場合、それを再利用することはできないため、新しいモデルを作成する必要がありますが、それが単なる PORO (プレーン オールド Ruby オブジェクト) である場合は、次を追加できます。イニシャライザへの行:
Opal.append_path Rails.root.join('app', 'shared')
次に、Rails アプリと Opal アプリの両方で使用できるようにしたい Ruby コードを に配置できます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
Reactive-Record ではそのままでこのように動作します。それ以外の場合は、データを取得するために、クライアント + v8 プリレンダリング エンジンとサーバーの間にある種の API を構築する必要があります (これは、reactive-record が行うことです)。" isomorphic..." 詳細については、React.rb Reactive-Ruby ブランチの readme を参照してください。