0

サーバー側の Ruby を Opal .js.rb ファイルに埋め込むことは可能ですか? 言い換えればUser.find(1)、.erb で行うように、Rails の一部の opal ファイルにアクセスする必要があります。

4

2 に答える 2

1

最初のリクエストでクライアントにデータを渡す方法を探しているようです。サーバーアプリにデータをロードして、それを渡したいだけの場合は、gongem を調べることができます。

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 は、gonJS オブジェクト化され、ブラウザーの 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
于 2015-09-22T23:34:44.363 に答える
1

Reactive-Record ではそのままでこのように動作します。それ以外の場合は、データを取得するために、クライアント + v8 プリレンダリング エンジンとサーバーの間にある種の API を構築する必要があります (これは、reactive-record が行うことです)。" isomorphic..." 詳細については、React.rb Reactive-Ruby ブランチの readme を参照してください。

于 2015-09-22T10:38:31.180 に答える