【问题标题】:Rails form works for creation, not updatingRails 表单用于创建,而不是更新
【发布时间】:2011-06-05 07:10:30
【问题描述】:

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

我的路线.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"

现在,如果我在地址栏中单击并按 Enter,它会将我直接带到它说不存在的路线。 create 操作具有相同的 redirect_to。

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

【问题讨论】:

  • 嗨@chip,你有 id 1 下“City”的记录吗??

标签: ruby-on-rails forms routing nested


【解决方案1】:

问题就在这一行

 simple_form_for @city, :url => state_cities_path

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

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

PUT /states/:state_id/cities/:id

需要什么来匹配更新路由,但你没有传递 id 或 http 方法。

解决方案?

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

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

不要忘记给@state 赋值,否则会引发 nil 错误。

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

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

redirect_to [@state,@city]

它会将用户发送到城市的表演活动。

【讨论】:

  • 太棒了。我确实在重定向到显示操作时遇到了问题,它给了我一个关于缺少操作的错误,但我最终重定向回了城市列表,这对我的目的来说同样有效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
相关资源
最近更新 更多