【问题标题】:Best way to integrate javascript app in rails在 Rails 中集成 javascript 应用程序的最佳方法
【发布时间】:2012-12-11 20:54:15
【问题描述】:

我的项目是在 Rails 中制作一个带有 html5 游戏的网站。

我有一个名为 games_controller 的控制器,我想将 /games/name-of-my-game 与每个 html5 游戏进行匹配。我创建了一条路线,与 games_controller 功能相匹配,但这是我的问题:

我希望我的 html5 游戏的一切都是“即插即用”的,我的意思是开发它们超出 Rails,然后只需将其复制/粘贴到我的应用程序中,一切正常(引用图像,.js文件和所有)。但我也希望我的游戏视图位于我的应用程序布局中。这是我尝试过的:

  • 把它放在/public目录下,在我games_controller的show方法里做render "/public/path_to_my_game"。这会破坏所有引用,例如 <script type="text/javascript" src="some_script.js"></script>,因为 URL 不是 */path_to_my_game* 而是 /games/name-of-my-game

  • 将它放在 /public 目录中,但在我的 show 方法中使用 redirect_to 而不是 render。引用没有损坏,但布局消失了(我可能错了,但布局被控制器卡住了,而不是静态文件)。

  • 把它放在 app/views/games 中,但这看起来很难看,所以我很快停下来:)。

有人有想法吗?

【问题讨论】:

  • 如果您只使用 rails 作为基本的布局包装器和路由器,我强烈建议您查看Sinatra
  • 您尝试过放入 app\assets\javascripts 并使用 javascript_include_tag 吗?
  • macek:老实说,我已经制作了这个网站的一部分,所以我现在会坚持下去(我想学习技术^^) AntarrByrd:作为我对 macek 帖子的评论,我想尽可能避免拆分我的游戏逻辑(一个文件夹中的一些文件,另一个文件夹中的一些文件......)。

标签: ruby-on-rails ruby-on-rails-3 html


【解决方案1】:

如果你有类似的东西

# config/routes.rb
match '/games/:game' => 'games_controller#show'

# app/controllers/games_controller.rb
def show
  @game = params[:game]
end

你真正需要在你的布局文件中做的是

<%= javascript_include_tag @game %>

这意味着您拥有的每个游戏都会有一个app/assets/javascripts/&lt;game&gt;.js 文件。它将负责启动每个游戏。

显然,您需要采取预防措施来验证params[:game] 是一个有效的游戏。


或者,您可以在布局文件中创建内容部分

<html>
  <head>
    <%= yield :game %>
  </head>
  <!-- rest of layout ... -->

然后使用您的GamesController 提供适当的视图

# app/controllers/games_controller.rb
def show
  @game = params[:game]
  render "games/#{@game}"
rescue ActionView::MissingTemplate
  redirect_to root_path, :alert => "invalid game id"
end

然后在您的游戏视图中,您将需要每个游戏的所有必要文件。比如一个用户访问/games/pacman

# app/views/games/pacman.html.erb
<% content_for :game do %>
  <%= javascript_include_tag 'pacman/foobar' %>
  <%= javascript_include_tag 'pacman/start' %>
  <%= stylesheet_link_tag 'pacman/styles' %>
<% end %>

另一个例子,用户访问/games/time_pilot

# app/views/games/pacman.html.erb
<% content_for :game do %>
  <%= javascript_include_tag 'time_pilot/init' %>
  <%= stylesheet_link_tag 'time_pilot/base' %>
  <%= stylesheet_link_tag 'time_pilot/retro' %>
<% end %>

因为我确信每个游戏都会有不同数量的依赖项,并且它们的初始化方式都不同,所以您可以相应地为每个游戏构建视图并提供与每个游戏相关的任何资产。


有关布局和渲染的更多帮助,请参阅 rails 指南:Layouts and Rendering in Rails

【讨论】:

  • 感谢您提供如此完整的答案:)。我会尽快尝试,即使这不是我想要的 100%。它不适合“即插即用”部分,因为我必须创建一个 .html.erb 文件(仅限 rails),并且我必须将 .js 拆分为 assets/js,将 .css 拆分为 assets/stylesheets。 .. 将所有内容都放入 /public 对我来说很好,因为这就像在一个街区中移动所有内容一样。 /public 目录没有任何解决方案吗?这种方法有什么不好的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2011-03-27
  • 2017-11-24
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多