将服务器端Ruby嵌入到rails中的opal文件中

时间:2015-09-22 04:21:30

标签: ruby-on-rails opalrb react.rb

是否可以将serverside ruby​​嵌入到Opal .js.rb文件中? 换句话说,我需要在Rails中的一些蛋白石文件中访问例如User.find(1),就像使用.erb一样。

2 个答案:

答案 0 :(得分:1)

在Reactive-Record中开箱即用。否则你必须在客户端+ v8预渲染引擎和服务器之间构建某种api以获取数据(这是反应记录所做的。)你可以在标有“的文件中查看reactive-ruby和reactive-record的代码”。 isomorphic ...“有关详细信息,请参阅React.rb Reactive-Ruby分支自述文件。

答案 1 :(得分:1)

听起来您正在寻找在初始请求中将数据传递给客户端的方法。如果您在服务器应用程序中加载数据并且只想传递它,则可以查看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`))

解释:

gon gem设置一个散列,该散列将被JS对象化并放入浏览器中的JS运行时。有关详细信息,请参阅Railscast有关它的信息(它仍然最相关,没有太大变化)。

在浏览器中,该JS对象也被命名为gon,因此gon.current_user将是您在控制器操作(或before_action回调)中gon.push current_user: some_user中设置的任何内容。

但我们需要使用Hash.new(gon.current_user)将其从JS对象转换为Ruby哈希,然后您可以将生成的哈希传递给User.new调用。

重要的部分:您需要在您的Opal应用中拥有User课程。如果您的Rails应用设置了User ActiveRecord模型,您将无法重复使用它,因此您需要创建一个新模型,但如果它只是一个PORO (普通的Ruby对象),您可以将以下行添加到初始化程序:

Opal.append_path Rails.root.join('app', 'shared')

然后,您可以在app/shared中的Rails应用和Opal应用中放置您想要的Ruby代码。例如,您可以在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