找不到 InfosController 的“更新”操作

pxl*_*sis 2 action controller ruby-on-rails object

因此,我正在尝试创建一个网站,您可以在其中输入名为 Info 的对象的标题和价格。当我输入标题和价格并按提交时,它被重定向到的页面显示“找不到 InfosController 的操作\'更新\'”。我希望它闪烁一条消息,通知用户对象已成功创建。有什么帮助吗?

\n\n

控制器/infos_controller.rb

\n\n
class InfosController < ApplicationController\n    def index\n    @info = Info.new\n  end\n\ndef create\n    @info = Info.new(params[:info])\n\nif @info.save\n    flash[:notice] = \'Object created successfully, thank you\'\n    render :index\n   else\n    flash[:notice] = \'Sorry! Object was not created successfully\'\n    render :new\n  end\nend\n  def update\n    @info = Info.find(params[:id])\n    if @info.update_attributes(params[:info])\n        # if update is successful\n    else \n        # if update is unsuccessful\n    end\n    redirect_to infos_path\nend\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

视图/infos/index.html.erb

\n\n
<h1>Please enter information about an Info object</h1>\n<%= form_for @info, url: {action: "create"} do |f| %>\n<%= f.label :title %><br />\n<%= f.text_field :title %> <br />\n<%= f.label :price %><br />\n<%= f.text_field :price %> <br />\n<%= f.submit "Submit" %> <br />\n<% end %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

模型/info.rb

\n\n
class Info < ActiveRecord::Base\n  attr_accessible :price, :title\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

新错误

\n\n
ActiveRecord::RecordNotFound in InfosController#update\n\n\nCouldn\'t find Info with id=create\n\n\nRails.root: C:/Sites/2/information\n\nApplication Trace | Framework Trace | Full Trace\n\n\napp/controllers/infos_controller.rb:18:in `update\'\n\n\nRequest\n\n\nParameters:\n\n\n{"utf8"=>"\xe2\x9c\x93",\n\n "_method"=>"put",\n\n "authenticity_token"=>"aXaLYDb5yhl2NXNriOf9gub2JcArrkUOdBogX4kcfKA=",\n\n "info"=>{"title"=>"strawberries",\n\n "price"=>".89"},\n\n "commit"=>"Submit",\n\n"id"=>"create"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,这里是views\\infos\\create.html.erb

\n\n
<h1>Infos#create</h1>\n<p>Find me in app/views/infos/create.html.erb</p>\n<h2><% if flash[:notice] %> <%= flash[:notice] %></h2> \n
Run Code Online (Sandbox Code Playgroud)\n

zea*_*soi 5

如果您InfosController完整地发布了您的内容,那么您就错过了update操作。添加类似于如下:

\n\n
# app/controllers/infos_controller.rb\ndef update\n    @info = Info.find(params[:id])\n    if @info.update_attributes(params[:info])\n        # if update is successful\n    else \n        # if update is unsuccessful\n    end\n    redirect_to infos_path\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

您没有点击该create操作的可能原因是您的表单正在提交到与该update路径匹配的路径,而不是create路径。

\n\n

首先,如果您已经为infos资源实现了 RESTful 路由(正如您所指出的那样),则不需要显式声明get "infos/create"因为您有 \xe2\x80\x93 创建路由是在资源丰富的路由声明中隐式创建的。

\n\n

然后,如果您确实想要一个form_for帮助程序来发布您的create操作,请尝试将散列传递给url您的密钥form_for

\n\n
<%= form_for @info, url: {action: "create"} do |f| %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新2

\n\n

您没有执行update操作的原因是您将表单发布到的路径是/infos/create,而根据规范的 Rails 指南,您应该发布到/infos。您只需删除url您的参数即可解决此问题form_for即可解决此问题:

\n\n
<%= form_for @info do |f| %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

默认情况下,Rails 知道将form_for新对象的提交路由到相应的对象create控制器的相应操作。

\n\n

您点击该update操作的原因是 Rails 会采用您当前提交的路径,例如,并使用of (而不是数字 id)/infos/create路由到该操作。要正确调用该操作,您应该将现有对象(例如,)传递给您的助手。这将自动将您的提交发送至updateparams[:id]createupdate InfoInfo.firstform_forupdate操作:

\n\n
# app/controllers/infos_controller.rb\ndef edit\n    @info = Info.find(params[:id]) # let\'s assume the id == 42\nend\n\n# app/views/infos/edit.html.erb\n<%= form_for @info do |f| %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为您正在传递一个现有Info对象,所以此form_for帮助器会自动将请求 POST 到 path /infos/42。因为HTTP请求方法是POST,所以请求会自动路由到action update,其中params[:id]将等于42上例中的操作。

\n\n

get "infos/create"应该完全删除routes.rb,因为该create路由已经在您的resources :infos声明中隐式创建。

\n