【问题标题】:Rails form_for wrong methodRails form_for错误的方法
【发布时间】:2014-02-07 09:41:52
【问题描述】:

我的一个表单有一个奇怪的问题。该表单仅更改对象的一个​​变量,称为 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 部分时,它会以更新方法结束。 注册控制器/模型的其他一切工作正常。有人知道这里发生了什么吗?谢谢!

更新 在几乎发疯之后,我让它像这样工作,但只能使用 :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.我必须改变什么才能使它与 :post 一起工作? 2. 据我了解,如果我只是说明控制器和动词(:get / :post / ...),rails 会知道它必须使用哪种方法,因为动词被映射到方法。但是当我陈述整个路径(控制器和方法)时,如果没有动词,rails 不应该知道它需要的一切吗?无论如何,表单参数正在发送。

更新2 好的,我变了

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

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

现在一切正常。

【问题讨论】:

  • 嗯,是的,如果您使用:get,您将调用#show。这就是宁静资源的工作方式。这里有什么问题?

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


【解决方案1】:

Rails' Resource Routing你会最好看


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

【讨论】:

  • 感谢您的回答。我之前有 :post ,但我认为我的路由有问题,所以此时它不起作用,我认为是动词。
  • 不,我只是在测试,我收到了 ActionController::RoutingError (No route matches [POST] "/enrolments/admin_comment.28"): 错误。
  • 我忘了,我有一个关于注册的资源映射,也许这就是问题所在?我用这部分更新了问题。
  • cmets 在哪里进入路线?它有自己的控制器吗?
  • 没问题!如果您需要更多帮助,请告诉我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多