pxl*_*sis 2 action controller ruby-on-rails object
因此,我正在尝试创建一个网站,您可以在其中输入名为 Info 的对象的标题和价格。当我输入标题和价格并按提交时,它被重定向到的页面显示“找不到 InfosController 的操作\'更新\'”。我希望它闪烁一条消息,通知用户对象已成功创建。有什么帮助吗?
\n\n控制器/infos_controller.rb
\n\nclass 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\nRun 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 %>\nRun Code Online (Sandbox Code Playgroud)\n\n模型/info.rb
\n\nclass Info < ActiveRecord::Base\n attr_accessible :price, :title\nend\nRun Code Online (Sandbox Code Playgroud)\n\n新错误
\n\nActiveRecord::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"}\nRun 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> \nRun Code Online (Sandbox Code Playgroud)\n
如果您InfosController完整地发布了您的内容,那么您就错过了update操作。添加类似于如下:
# 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\nRun Code Online (Sandbox Code Playgroud)\n\n更新:
\n\n您没有点击该create操作的可能原因是您的表单正在提交到与该update路径匹配的路径,而不是create路径。
首先,如果您已经为infos资源实现了 RESTful 路由(正如您所指出的那样),则不需要显式声明get "infos/create"因为您有 \xe2\x80\x93 创建路由是在资源丰富的路由声明中隐式创建的。
然后,如果您确实想要一个form_for帮助程序来发布您的create操作,请尝试将散列传递给url您的密钥form_for:
<%= form_for @info, url: {action: "create"} do |f| %>\nRun Code Online (Sandbox Code Playgroud)\n\n更新2:
\n\n您没有执行update操作的原因是您将表单发布到的路径是/infos/create,而根据规范的 Rails 指南,您应该发布到/infos。您只需删除url您的参数即可解决此问题form_for即可解决此问题:
<%= form_for @info do |f| %>\nRun Code Online (Sandbox Code Playgroud)\n\n默认情况下,Rails 知道将form_for新对象的提交路由到相应的对象create控制器的相应操作。
您点击该update操作的原因是 Rails 会采用您当前提交的路径,例如,并使用of (而不是数字 id)/infos/create路由到该操作。要正确调用该操作,您应该将现有对象(例如,)传递给您的助手。这将自动将您的提交发送至updateparams[:id]createupdate InfoInfo.firstform_forupdate操作:
# 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| %>\nRun Code Online (Sandbox Code Playgroud)\n\n因为您正在传递一个现有Info对象,所以此form_for帮助器会自动将请求 POST 到 path /infos/42。因为HTTP请求方法是POST,所以请求会自动路由到action update,其中params[:id]将等于42上例中的操作。
get "infos/create"应该完全删除routes.rb,因为该create路由已经在您的resources :infos声明中隐式创建。
| 归档时间: |
|
| 查看次数: |
7965 次 |
| 最近记录: |