1

我有一个名为 /monsters 的模板 url。在模板中,我有一个侧边栏

按类型排序:

  • 地球
  • 飞行
  • ETC...

我想知道每个路由的最佳方式是什么?我猜有这样的网址会很好

www.example.com/monsters/water 

或者

www.example.com/monsters/fire.

我应该怎么做呢?在我的 routes.rb 上我想到了

match 'monsters/water',     to: 'monsters#water'
match 'monsters/fire',      to: 'monsters#fire'
match 'monsters/earth',     to: 'monsters#earth'
match 'monsters/flying',    to: 'monsters#flying'

ETC...

但我觉得那不是一个好方法。每次都有单独的比赛去不同的动作?有人可以帮我设计吗?非常感谢您提供全面而明确的帮助=)

谢谢一堆=)

或者我什至应该有单独的链接开始?我应该将所有内容都发布到我的索引操作中吗?我想过使用表格并使用 :post 但这已经被我的怪物创建动作所采用。目前在我的索引页面 (/monsters) 上列出了所有这些,因为在我的索引操作中,我只是做了一个

@monsters = Monster.paginate(page: params[:page])
4

2 回答 2

3

你需要的是:

resources :monsters, path: '/monsters/:category'

这将生成这些路由:

named path   | verb   | route                                  | controller#action
             |        |                                        |
monsters     | GET    | /monsters/:category(.:format)          | monsters#index
monsters     | POST   | /monsters/:category(.:format)          | monsters#create
new_monster  | GET    | /monsters/:category/new(.:format)      | monsters#new
edit_monster | GET    | /monsters/:category/:id/edit(.:format) | monsters#edit
monster      | GET    | /monsters/:category/:id(.:format)      | monsters#show
monster      | PUT    | /monsters/:category/:id(.:format)      | monsters#update
monster      | DELETE | /monsters/:category/:id(.:format)      | monsters#destroy

它将允许您执行以下操作:

/monsters/fire  => { controller: 'monsters', action: 'index', category: 'fire' }
/monsters/water => { controller: 'monsters', action: 'index', category: 'water' }
/monsters/earth/15 => { controller: 'monsters', action: 'show', category: 'earth', id: 15 }

另外,您仍然可以使用命名路径:

monsters_path('flying') => '/monsters/flying'
edit_monster_path('fire', 15) => '/monsters/fire/15'

并链接到怪物,如:

<%= link_to monster.name, monster_path(monster.category, monster.id) -%>
于 2012-04-24T07:01:00.250 回答
2

您应该指定一个接受可变段的通用路由,并使用它来加载正确类型的怪物:

match "monsters/:category" => "monsters#index"

...

class MonstersController < ApplicationController
  def index
    @monsters = Monster.find_by_category(params[:category])
  end
end

您可以使该:category段可选并修改您的索引操作以有条件地使用它,如果它被传入:

def index
  @monsters = Monster.find_by_category(params[:category]) if params[:category]
  @monsters ||= Monster.all
end
于 2012-04-21T00:50:16.710 回答