Rails表单用于创建,而不是更新

时间:2011-06-05 07:10:30

标签: ruby-on-rails forms routing nested

我有一个城市形式,适用于城市的初始创建,但当我尝试更新城市时,我收到路由错误。

我的routes.rb:

 map.resources :states do |state|
 state.resources :cities
end

表格:

  <% simple_form_for @city, :url => state_cities_path do |f| %>
  <%= f.input :name %>
  <%= f.input :active %>
  <%= f.submit "Save City" %>
  <% end %>

控制器:

  if @city.update_attributes(params[:city])
    format.html { redirect_to state_cities_path(:state_id => @city.state_id) }
    format.xml  { head :ok }

错误:

No route matches "/states/1/cities"

现在,如果我点击地址栏,然后按回车键,我就会看到它说不存在的路线。 create动作具有相同的redirect_to。

想法?这是POST与PUT的问题吗?

1 个答案:

答案 0 :(得分:0)

问题在于这条线

 simple_form_for @city, :url => state_cities_path

您不会让表单构建器创建正在强制它的正确路径。 表单构建器通过检测是否是新记录为您传递的实例创建正确的路径,然后在html表单的action属性中设置正确的路径并设置正确的http方法。

似乎您对使用嵌套路由这一事实感到困惑,并且正在尝试传递路径/ url,因此表单构建器不再检测任何内容并让您设置所有内容,因为表单默认发布,并且您是将url传递给create操作,它永远不会与更新操作匹配。您只是映射到创建操作,因为更新操作需要像这样的ID

PUT /states/:state_id/cities/:id

有匹配更新路由所需的内容,但您没有传递id和http方法。

解?

让表单构建器创建路径,这是通过使用父实例和您希望表单构建器使用的子实例传递数组来完成嵌套路由。

simple_form_for [@state,@city] do |f|

不要忘记将值放入@state中,否则会引发nil错误。

现在,表单构建器应该正确地为创建和更新操作构建正确的路径。

顺便说一句,你也可以重定向到像这样的数组

redirect_to [@state,@city]

它会将用户发送到城市的show动作。