在我的应用程序中,我有2个型号Foo和Bar。 Foo'have_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的实例,但后来我遇到错误,该路径不存在。
有人能帮我看看我做错了吗?
答案 0 :(得分:1)
使用simple_form_for
,您可以使用url
属性来指定表单的网址。试试这个:
= simple_form_for @bar, url: edit_baz_foo_bar_path do |f|
我不确定上面写的路径是否正确,请运行rake routes
查看路线。
答案 1 :(得分: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