轨道上的红宝石没有做正确的动作

时间:2009-11-10 20:38:24

标签: ruby-on-rails

我正在尝试编辑表单,路由是控制器/ id /操作以进行编辑,例如

人/ 124321 /编辑

我正在尝试使用此代码将此表单提交给更新操作:

<% form_for :probe, @probe, :action => "update" do |f| %>
   ...
   ...
   ...
   <%= submit_tag 'Submit' %>
<% end %>

当我点击提交时,它会给我一个错误说明

未知行动。 没有采取任何行动(id)。

修改

我为探针指定的路由中唯一的东西是map.resources:probes

当我生成控制器时,RoR只是自己做了/ 124321 /编辑。

Rake路线显示此

probes       GET /probes(.:format) {:controller=>"probes", :action=>"index"}
             POST   /probes(.:format) {:controller=>"probes", :action=>"create"}
new_probe    GET    /probes/new(.:format) {:controller=>"probes", :action=>"new"}
edit_probe   GET    /probes/:id/edit(.:format) {:controller=>"probes",action=>"edit"}
             GET    /probes/:id(.:format) {:controller=>"probes", :action=>"show"}
             PUT    /probes/:id(.:format) {:controller=>"probes", :action=>"update"}
             DELETE /probes/:id(.:format) {:controller=>"probes", :action=>"destroy"}

编辑2个探测控制器

    def edit
     @probe = Probe.find(params[:id])
    end

    def update
    @probe = Probe.find(params[:id])
    debugger
    if @probe.update_attributes(params[:probe])
      flash[:notice] = "Successfully updated probe."
      redirect_to probes_path
    else
      render :action => 'edit'
    end
  end

3 个答案:

答案 0 :(得分:3)

很难准确地说,因为你已经发布了很少的问题支持细节,但我的猜测是你的路线文件被设置为匹配:controller/:action/:id匹配的东西的优先级出现在你的路线之前瞄准,:controller/:id/:action

路线自上而下评估,首次匹配胜利。

我也会回应约翰的回答。您不需要指定:action => 'update',事实上这些天我通常会将new.html.erbedit.html.erb中的表单提取到部分_form.html.erb中。 form_for将根据情况确定对象是否为新记录并发布到createupdate操作。

我看到过去在开发模式下重新加载路由更改的一些情况会混淆路由代码,这通常是通过重新启动服务器来修复的。

rake routes也是一个很好的调试工具。检查页面源以查看Rails用于表单action属性的内容,然后向下扫描rake routes的输出以查看请求最终的位置。

答案 1 :(得分:2)

如果您正在使用RESTful资源,那么您应该能够这样做:

<% form_for(@probe) do |f| %>
  .
  .
  .
  <%= f.submit 'Submit' %>
<% end %>

Rails可以判断您是创建新记录还是更新现有记录。有关详细信息,请参阅Binding a Form to an Object

另外,请注意我的示例中使用f.submit*_tag帮助者会聚在一起,因此您通常不会看到form_for帮助submit_tag

答案 2 :(得分:0)

“未知行动。没有任何行动回应(身份证)。”听起来像路由问题。

您是否删除或删除了routes.rb文件中的默认路由?

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

如果正在运行默认路由,它可能会交换操作的ID吗?