Rails:非正统网址的资源?

时间:2010-09-23 20:05:27

标签: ruby-on-rails routes view-helpers

我想要一个这样的网址:

/工资/区域/ 1

我希望它映射到Tasks Controller的payroll_list函数。我也想使用REST。最好的方法是什么?

非常感谢!

2 个答案:

答案 0 :(得分:1)

好吧,我建议你最好按照惯例来处理Rails。如果您仍然坚持使用这种“奇怪”的URL并且想要忽略在进一步开发过程中可能产生的问题/头痛,那么请尝试使用折射。

我不想变得粗鲁,但目前我觉得你不明白为什么宁静的网址就是这样。请先了解后面的设计,然后重新考虑您的应用程序/控制器和路由设计。我打赌你会受到启发。

在此示例中,您的网址可能应为/regions/1/payrolls map.resources :regions, :has_many => :payrolls。然后,您的工资单列表将由具有PayrollsController的{​​{1}}呈现 - 这实际上是有意义的(可能是您尝试使用您的网址布局实现的)。代码段:

params[:region_id]

如果您仍希望在不同的命名URL下拥有资源,请使用以下命令:

def index
  if params[:region_id]
    @region = Region.find(params[:region_id])
    @payrolls = @region.payrolls
  else
    @payrolls = Payroll.all
  end
end

这将使用命名的URL部分“payrolls”将嵌套资源映射到任务控制器。但这可能不像您预期​​的那样有效,因为宁静的逻辑意味着您应该在map.resources :regions do |regions| regions.resources :tasks, :as => :payrolls end 中处理工资单模型。否则你可能会遇到看起来很奇怪的代码。也许你的PayrollsController的设计是错的? Rails可能会期望将任务处理到您的任务控制器,尽管您将其命名为payrolls。至少这可能令人困惑(但是,它实际上并不期望这些是任务模型,所以它可能会起作用)。

BTW - 请记住:“restful”也意味着您的应用程序应该回答资源上的标准谓词,而不仅仅是使用“足智多谋”的路由。它也是关于GET,PUT,DELETE和POST http动词,当然还有“编辑”,“新”等默认动作。不要试图让你的控制器变得庞大而复杂。遵循“瘦瘦的控制器 - 脂肪模型”的座右铭。

答案 1 :(得分:0)

好的,这是一个更好的问题,那么可能就是这样:

我怎样才能使用你的建议:

/地区/ 1 /工资表

将REST映射到:

带有索引,新等的任务控制器,前缀为“payroll _”?

像这样:TasksController#payroll_index或TasksController#payroll_new