正确路由:has_many:通过

时间:2017-07-05 15:29:49

标签: ruby-on-rails ruby controller routes associations

好的..我的导航栏中有一个包含多个下拉菜单的网站。它有点像这样:

Gran Turismo(第一个标题下降到:)

  • PS4
  • PS3等。

Forza(第二个标题下降到:)

  • PS4
  • PS3等..
  

我的目标是当我点击其中一个下拉菜单时,它将显示一个使用路线显示的页面:

www.mysite.com/forza/ps4

每个人都告诉我,我应该使用has_many :through到第三个模型,我称之为平台。

我的模特就是这样:

class Game < ApplicationRecord
  has_many :platforms
  has_many :consoles, through: :platforms
end

class Console < ApplicationRecord
  has_many :platforms
  has_many :games, through: :platforms
end

class Platform < ApplicationRecord
  belongs_to :game
  belongs_to :console
end

我的路线是这样的:

  resources :platforms, only: [:show] do
    resources :games do
      resources :consoles
    end
  end

理想情况下,在最终的show.html.erb中,我猜测平台会显示,我想在平台PS4上显示我专门为游戏Forza销售的产品,我选择了我选择的下拉菜单我选择..

然而我的路线却是这样的:

/platforms/:platform_id/games/:game_id/consoles/:id(.:format)   

我出错的任何想法?如果有更简单的解决方法吗?

非常感谢!

更新

&#34;平台&#34;可能会有点混乱。也许&#34; MarketPlace&#34;会更合适。虽然现在正在阅读,但也许我不应该有第三个模型,只是在控制台结束它。

如果选择了不同的游戏,我只希望最终的展示页面略有不同。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义路线获得所需的确切路线(例如www.mysite.com/forza/ps4),如下所示:

get "/:game/:console", to: "games#show"

GamesController中,您可以检索这两个参数并搜索您要显示的Game,如下所示:

def show
  @console = Console.find_by(name: params[:console])
  @game    = Game.find_by(name: params[:game])
  # ...
end

请注意,只有满足以下所有条件时,此操作才会一致:

  • Game模型包含唯一名称(或您选择用作 slug 的任何列)。

  • 您没有其他具有相同模式的路线(例如 /:other /:route )。

  • Game名称与任何型号名称不同(除非该型号具有处理冲突的自定义路线,或根本不具有路线)。

  • 路线在路线的末尾定义,因此不会干扰其他路线。