0

我的项目是在 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目录中,但redirect_to在我的show方法中使用 a 代替render。引用没有损坏,但布局消失了(我可能错了,但布局被控制器卡住了,而不是静态文件)。

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

有人有想法吗?

4

1 回答 1

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 %>

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


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

于 2012-12-11T21:08:07.613 回答