0

使用 HAML 代码:

%form{:action => "activate_foobar", :method => :post, :controller => "foobar", :url => activate_foobar_foobar_index_path}
%input{:type => "submit", :value => "Activate"}

提交按钮指向

No route matches "/activate_foobar"

而不是“/foobar/activate_foobar”。它似乎不理解 url 参数。


细节

在 foobar 的索引页面上,有一个表单,我试图将其发布到 foobar_controller 的方法 activate_foobar。Foobar 没有模型,因为没有这样的对象——它只是 Widget 的一个特殊属性。(小部件有一个模型和一个方法 .activate_foobar)

activate_foobar_foobar_index 在路由中定义为:

resources :foobar, :only => [:index] do
  collection do
    post :activate_foobar
  end
end

:用 rake:routes 确认为:

activate_foobar_foobar_index POST     /foobar/activate_foobar(.:format)   {:action=>"activate_foobar", :controller=>"foobar"}

: 正如预期的那样。

此外,实验一个简单的:

=link_to "Activate", activate_foobar_foobar_index_path, {:method => :post}

:路由成功到 /foobar/activate_foobar

在使用表单(而不是使用 simple_form_for 或其他基于模型的解决方案)的范围内,您如何更正路径“foobar/activate_foobar”?

资料来源:我正在关注http://guides.rubyonrails.org/routing.html “添加更多 RESTful 操作”和http://www.w3schools.com/html/html_forms.asp以尝试了解如何引导表单到正确控制器的正确方法。

4

2 回答 2

1

就像您说的那样,它将表单发送到 /activate_foobar,由于某种原因(可能是 haml 错误),它不采用 :controller 参数来解决这个问题

:action => 'foobar/activate_foobar'

但是您必须小心,因为它采用相对路径而不是绝对路径。因此,如果您不想处理该问题,我建议您更改为 rails form helper

= form_tag(activate_foobar_foobar_index_path, :method => :post) do
于 2013-02-27T19:08:28.097 回答
0

由于 activate_foobar 嵌套在 foobar 下,您是否尝试过

 :url => activate_foobar_foobar_index_path(@foobar) 

你需要告诉 rails 在哪里寻找特定的 foobar 来激活 foobar。

希望能帮助到你。

于 2013-02-27T16:34:14.403 回答