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

d11*_*wtq 6 routing ruby-on-rails

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

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

resources :agreements, :except => [:index, :create] do
  get :create, :on => :collection
end
Run Code Online (Sandbox Code Playgroud)

如果get :createget :something,我们就不得不像一个路线

Helper:  something_agreement_path
Request: GET /agreements/:agreement_id/something
Action:  agreements#something
Run Code Online (Sandbox Code Playgroud)

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

Helper:  agreements_path
Request: GET /agreements
Action:  agreements#create
Run Code Online (Sandbox Code Playgroud)

错误或功能?

Cha*_*ray 1

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

由内而外的导轨布线

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

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