Rails 4和simple_form用于关联路由

时间:2015-11-17 20:25:44

标签: ruby-on-rails ruby ruby-on-rails-4 simple-form simple-form-for

在我的应用程序中,我有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的实例,但后来我遇到错误,该路径不存在。

有人能帮我看看我做错了吗?

2 个答案:

答案 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