资源丰富的路由,但使用GET而不是POST的#create操作

时间:2011-11-14 07:59:11

标签: ruby-on-rails routing

虽然它通常违反我们的设计原则,但我们需要让控制器对GET请求执行它的#create操作(它是涉及外部服务的一系列重定向的工作流的一部分)。有人知道这样做的目的是什么吗?我真的不想走出Rails路由提供的资源丰富的路由框架。我们不需要通常会响应该GET请求的#index操作。

我发现(令人惊讶的是)这是有效的,但我不知道它是否有意,或者我们是否正在利用Rails中的一个错误并在以后发生破坏的风险:

resources :agreements, :except => [:index, :create] do
  get :create, :on => :collection
end

如果get :createget :something,我们就有了像

这样的路线
Helper:  something_agreement_path
Request: GET /agreements/:agreement_id/something
Action:  agreements#something

但是Rails实际上产生了我们想要的东西:

Helper:  agreements_path
Request: GET /agreements
Action:  agreements#create

错误或功能?

1 个答案:

答案 0 :(得分:1)

我知道这可能不适用于最新的路由代码,但此链接有大量有关Rails路由的信息。在2.3节中,它介绍了如何构建RESTful路由。

Rails Routing from the Inside Out

如果我想通过我在那里简要阅读的内容来猜测。手动将默认REST操作分配给特定路由。因此,当您将创建操作更改为使用GET时,它会在创建新操作之前创建某种记录(路由的哈希)。

因此,为了回答您的问题,我认为此行为是基于Rails的路由代码的内部工作原理。我认为这种情况总有可能在未来某个时候发生变化。