无法找到InfosController的操作“更新”

时间:2013-12-04 05:15:32

标签: ruby-on-rails object controller action

所以我有一个我试图制作的网站,您可以在其中输入名为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> 

1 个答案:

答案 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/createaccording 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声明中隐式创建。