这是处理铁路中许多路线的正确方法吗?

时间:2012-04-21 00:45:16

标签: ruby-on-rails forms filter routing

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

按类型排序:

  • 地球
  • 飞行
  • 等...

我想知道什么是最好的方式来路由每一个?我猜这个网站会很好,比如

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'

等...

但我觉得这不是一个好方法。每次都有一个单独的比赛进行不同的比赛?有人可以帮我设计吗?非常感谢彻底和明确的帮助=)

感谢一堆=)

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

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

2 个答案:

答案 0 :(得分: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) -%>

答案 1 :(得分: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