所以我有一个我试图制作的网站,您可以在其中输入名为Info的对象的标题和价格。当我输入标题和价格并按提交时,它被重定向到的页面显示"操作'更新'无法找到InfosController"。我希望它闪烁一条消息,通知用户该对象已成功创建。任何帮助??
控制器/ infos_controller.rb
class InfosController < ApplicationController
def index
@info = Info.new
end
def create
@info = Info.new(params[:info])
if @info.save
flash[:notice] = 'Object created successfully, thank you'
render :index
else
flash[:notice] = 'Sorry! Object was not created successfully'
render :new
end
end
def update
@info = Info.find(params[:id])
if @info.update_attributes(params[:info])
# if update is successful
else
# if update is unsuccessful
end
redirect_to infos_path
end
end
视图/相关信息/ index.html.erb
<h1>Please enter information about an Info object</h1>
<%= form_for @info, url: {action: "create"} do |f| %>
<%= f.label :title %><br />
<%= f.text_field :title %> <br />
<%= f.label :price %><br />
<%= f.text_field :price %> <br />
<%= f.submit "Submit" %> <br />
<% end %>
模型/ info.rb
class Info < ActiveRecord::Base
attr_accessible :price, :title
end
新错误
ActiveRecord::RecordNotFound in InfosController#update
Couldn't find Info with id=create
Rails.root: C:/Sites/2/information
Application Trace | Framework Trace | Full Trace
app/controllers/infos_controller.rb:18:in `update'
Request
Parameters:
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"aXaLYDb5yhl2NXNriOf9gub2JcArrkUOdBogX4kcfKA=",
"info"=>{"title"=>"strawberries",
"price"=>".89"},
"commit"=>"Submit",
"id"=>"create"}
此外,还有views \ infos \ create.html.erb
<h1>Infos#create</h1>
<p>Find me in app/views/infos/create.html.erb</p>
<h2><% if flash[:notice] %> <%= flash[:notice] %></h2>
答案 0 :(得分:4)
如果您完整地发布了InfosController
,则表示您错过了update
操作。添加类似于以下内容:
# app/controllers/infos_controller.rb
def update
@info = Info.find(params[:id])
if @info.update_attributes(params[:info])
# if update is successful
else
# if update is unsuccessful
end
redirect_to infos_path
end
<强>更新强>:
您未执行create
操作的可能原因是您的表单提交的路径与update
路径匹配,而不是create
路径。
首先,如果您已为infos
资源实施了RESTful路由(如您所示),则不需要显式声明get "infos/create"
- 创建路由是隐式创建的在你足智多谋的路线宣言中。
然后,如果您确实希望form_for
帮助程序POST到您的create
操作,请尝试将哈希值传递到url
声明中的form_for
键:
<%= form_for @info, url: {action: "create"} do |f| %>
更新2 :
您未执行update
操作的原因是,您发布表单的路径为/infos/create
,according to the canonical Rails guides时,您应该发布到/infos
。您只需删除url
声明中的form_for
参数即可解决此问题:
<%= form_for @info do |f| %>
默认情况下,Rails知道将新对象的form_for
提交路由到控制器的相应create
操作。
您点击update
操作的原因是Rails采用您当前提交的路径,例如/infos/create
,并使用update
params[:id]
(而不是数字ID)路由到create
操作。要正确调用update
操作,您应该将现有 Info
对象(例如Info.first
)传递给form_for
帮助程序。这会自动将您的提交路由到update
操作:
# app/controllers/infos_controller.rb
def edit
@info = Info.find(params[:id]) # let's assume the id == 42
end
# app/views/infos/edit.html.erb
<%= form_for @info do |f| %>
因为您传递的是现有Info
对象,所以此form_for
帮助程序将自动将请求发布到路径/infos/42
。由于HTTP请求方法是POST,因此请求将自动路由到update
操作,其中params[:id]
将等于上面示例中的42
。
get "infos/create"
应完全从routes.rb
删除,因为create
路由已在resources :infos
声明中隐式创建。