【问题标题】:ruby on rails form not doing correct actionruby on rails 没有采取正确的行动
【发布时间】:2009-11-10 20:38:23
【问题描述】:

我正在尝试编辑一个表单,路径是控制器/id/用于编辑的操作,例如

人/124321/编辑

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

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

当我点击提交时,它给了我一个错误提示

未知动作。 未对 (id) 做出任何响应。

编辑

我的路线中唯一为探测指定的是 map.resources :probes

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

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

【问题讨论】:

  • 你能准确地发布你的路线吗?
  • 应该是controller/action/id...对吧?还是我错过了什么?
  • 有时查看生成的 HTML 有助于了解问题出在控制器还是视图上。 HTML 应明确包含 /people//edit.

标签: ruby-on-rails


【解决方案1】:

很难准确地说,因为您为您的问题发布的支持细节非常少,但我猜您的路线文件已设置为匹配 :controller/:action/:id 的内容的优先级位于您的目标路线之前, :controller/:id/:action.

路线是自上而下评估的,第一场比赛获胜。

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

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

rake routes 也是一个不错的调试工具。检查页面源以查看 Rails 为表单的 action 属性使用了什么,然后向下扫描 rake routes 的输出以查看请求将在哪里结束。

【讨论】:

  • 在我的路线中为探测指定的唯一内容是 map.resources :probes RoR 只是在我生成控制器时自行完成了 people/124321/edit(我假设)
  • 这是整个 'rake routes' 输出吗?是否有任何路线不使用资源,而是使用较旧的 :controller/:action/:id 形式?此外,您的 Probe 对象的 ID 看起来与您在 John 的回答中的评论不同。那里嵌入了“+”字符。 Rails 可能会将它们解释为 URL 编码的空格,这可能会使路由器感到困惑。最后,当您切换到我和 John 建议的“form_for”语法时,您会遇到什么错误?
  • 我发现了问题,忘记更新了。它实际上与在 Rails 中混淆的命名约定有关。它弄乱了我的想法(而不仅仅是这个问题),在追踪了一段时间之后,我能够使用约翰建议的正常形式。不过,你们两个都让我走上了正轨,谢谢。非常感谢。
【解决方案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

【讨论】:

  • 当我这样做时,我在 form_for 行周围出现错误。评估 nil.to_sym 时发生错误
  • 这可能是因为您的 @probe 实例变量在控制器的编辑操作(方法)中为零。编辑操作显示适合编辑模型的表单。然后表单提交到更新操作。
  • 您对@probe 的价值是什么?
  • 来自编辑操作中的 ruby​​ 调试器............ irb(#<0x62d8f74>
【解决方案3】:

“未知操作。没有响应 (id) 的操作。”听起来像是路由问题。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多