我的一个表格有一个奇怪的问题。表单只更改对象的一个变量,称为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"
现在一切正常。
答案 0 :(得分:2)
HTTP动词
您在routes.rb文件中创建的每个resources :controller
都会创建一系列路由,这些路由与相对的HTTP谓词连接:
路由系统的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