Rails form_for错误的方法

时间:2014-02-07 09:41:52

标签: ruby-on-rails controller form-for

我的一个表格有一个奇怪的问题。表单只更改对象的一个​​变量,称为admin_comment。它最终出现在控制器的show方法中,在终端中:

Processing by EnrolmentsController#show as

以下是form_for

<%= form_for enrolment, :url => enrolments_admin_comment_path(enrolment), method: :get, remote: true do |f| %>

这是rake路线

enrolments_admin_comment GET    /enrolments/admin_comment(.:format)              enrolments#admin_comment

以及routes.rb部分

  get "enrolments/admin_comment"

  resources :courses do
      resources :enrolments
  end

当我从form_for中删除method: :get部分时,它会以更新方法结束。 注册控制器/模型的其他所有工作正常。有人知道这里发生了什么吗?谢谢!

更新 几乎疯了之后,我已经让它像这样工作了,但只有:得到方法。

routes.rb

  get "/enrolments/:id/admin_comment" => "enrolments#admin_comment", as: "enrolments_admin_comment"

form_for

<%= form_for enrolment, :url => enrolments_admin_comment_path(enrolment), method: :get, remote: true do |f| %>

如果我将方法更改为:post,则会收到以下错误:

ActionController::RoutingError (No route matches [POST] "/enrolments/28/admin_comment"):

出现了两个问题: 1.我需要改变什么才能使其发挥作用:发布? 2.据我所知,如果我只是陈述控制器和动词(:get /:post / ...),rails会知道它必须使用哪种方法,因为动词被映射到方法。但是当我说出整个路径(控制器和方法)时,不应该在没有动词的情况下知道它需要的一切吗?无论如何都会发送表格参数。

UPDATE2 好的,我已经改变了

get "/enrolments/:id/admin_comment" => "enrolments#admin_comment", as: "enrolments_admin_comment"

post "/enrolments/:id/admin_comment" => "enrolments#admin_comment", as: "enrolments_admin_comment" 

现在一切正常。

1 个答案:

答案 0 :(得分:2)

你最好看Rails' Resource Routing


HTTP动词

您在routes.rb文件中创建的每个resources :controller都会创建一系列路由,这些路由与相对的HTTP谓词连接:

HTTP Verbs

路由系统的HTTP verbs部分是最重要的部分,因为它控制加载哪个控制器操作。您可以使用具有不同HTTP谓词的相同路径帮助程序来路由到完全不同的控制器操作

如果要创建新路径,则需要将HTTP谓词设置为method: :post,如下所示:

<%= form_for enrolment, :url => enrolments_admin_comment_path(enrolment), method: :post, remote: true do |f| %>

<强>路线

也许你对这种路由结构会更好:

  resources :courses do
      resources :enrolments do
          get :admin_comment, shallow: :true
      end
  end