好的..我的导航栏中有一个包含多个下拉菜单的网站。它有点像这样:
Gran Turismo(第一个标题下降到:)
Forza(第二个标题下降到:)
我的目标是当我点击其中一个下拉菜单时,它将显示一个使用路线显示的页面:
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;会更合适。虽然现在正在阅读,但也许我不应该有第三个模型,只是在控制台结束它。
如果选择了不同的游戏,我只希望最终的展示页面略有不同。
答案 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
名称与任何型号名称不同(除非该型号具有处理冲突的自定义路线,或根本不具有路线)。
路线在路线的末尾定义,因此不会干扰其他路线。