在rails中集成javascript应用程序的最佳方式

时间:2012-12-11 20:54:15

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

我的项目是在Rails中创建一个包含html5游戏的网站。

我有一个名为games_controller的控制器,我希望将 / games / 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>之类的所有引用,导致网址不是* * * / path_to_my_game *但 / games / of my-game

  • 将其放在 / public 目录中,但redirect_to方法中的show代替render。引用没有被破坏,但布局已经消失(我可能错了,但是布局被控制器所困,而不是静态文件)。

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

有没有人有想法?

1 个答案:

答案 0 :(得分:0)

如果您有类似

的内容
# 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/<game>.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 %>

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


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