0

在我的应用程序中,我有 2 个模型 Foo 和 Bar。Foo 'has_one' 酒吧和酒吧 'belongs_to' Foo。

我的路由文件如下所示:

namespace :baz do
  resources  :foo do
    resources  :bar
  end
end

我正在使用simple_form gem。因此,对于像上面提到的那样的嵌套路由,我希望以下工作:

= simple_form_for [:baz , :foo, @bar]  do |f|

当创建一个新的@bar 时,这条线工作得很好。当我尝试编辑现有的@bar 时,它会失败并显示以下错误消息:

No route matches {:action=>"show", :controller=>"baz/bar", :id=>nil, ...

我做了一些研究,似乎它与我的“form_for”参数有关。我尝试将标签更改为:

= simple_form_for [:baz , @foo, @bar]  do |f|

...并且我确保在我的控制器中调用 @foo 的一个实例,但随后我收到一个错误,即路径不存在。

有人可以帮我看看我做错了什么吗?

4

2 回答 2

1

您可以使用属性simple_form_for指定表单的 url 。url尝试这个:

= simple_form_for @bar, url: edit_baz_foo_bar_path do |f|

我不确定我上面写的路径是否正确,请通过 run 查看您的路线rake routes

于 2015-11-17T20:31:48.340 回答
0

这应该工作得很好:

= simple_form_for [:baz , @foo, @bar]  do |f|

可能您在控制器中的分配有问题。

如果你在 Baz::FooBarController 中有这样的东西:

class Baz::FooBarController < ApplicationController
  def new
    @foo = Foo.find(params['foo_id'])
    @bar = @foo.bars.new
  end

  def edit
    @bar = Bar.find(params['id'])
    @foo = @bar.foo
  end
end

然后 new.html.slim 是这样的:

= simple_form_for [:baz , @foo, @bar]  do |f|

应该产生这个html:

<form id="new_bar" class="simple_form new_bar method="post" accept-charset="UTF-8" action="/baz/foo/1/bars" novalidate="novalidate">

和相等的edit.html.slim:

= simple_form_for [:baz , @foo, @bar]  do |f|

应该产生这个html:

<form id="edit_bar_1" class="simple_form edit_bar" method="post" accept-charset="UTF-8" action="/baz/foo/1/bar/1" novalidate="novalidate">

如果这对您不起作用,或者如果您决定要手动设置路径,但您仍想在新视图和编辑视图中使用相同部分的表单,您可以执行以下操作:

= simple_form_for @bar, url: @bar.new_record? ? new_baz_foo_bars_url(foo_id: @foo.id) : edit_baz_foo_bar_url(foo_id: @foo.id, id: @bar.id) do
于 2015-11-17T21:16:13.367 回答