0

在我的應用程序中,我有2個模型Foo和酒吧。 Foo has_one'Bar and Bar'belongs_to'Foo。相關路線的Rails 4和simple_form

我的路由文件看起來是這樣的:

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

我使用的simple_form gem。因此,對於像上面提到的一個嵌套的路線,我希望下面的工作:創建一個新的@bar時

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

這行工作完全正常。當我嘗試編輯現有@bar,它與此錯誤消息但失敗:

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

我已經做了一些研究,現在看來似乎有事情做與我「的form_for」 PARAMS。我曾試圖改變標籤這樣的:

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

...我已經取得了一定要打電話@foo的一個實例,在我的控制器,但後來我提出了一個錯誤的路徑不存在。

有人能幫我看看我做錯了嗎?

回答

1

使用simple_form_for您可以使用url屬性來指定表單的url。試試這個:

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

我不知道如果我上面寫的路徑是正確的,請有通過運行rake routes在你的路由的樣子。

+0

謝謝@LongNguyen。我確實嘗試了這一點,但它確實有效,但它會要求我有一個單獨的表單來創建或編輯我的記錄,我試圖避免這種記錄。 – Herm

+0

在這種情況下,您可以檢查當前操作是否更新,然後更改爲正確的路徑。我目前正在做我的項目:) –

0

這應該工作完全正常:

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

也許你正在做的事情錯在控制器的分配。

如果您在巴茲:: 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"> 

and equal edit.html.slim:

如果你決定去與手動設置路徑

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

如果這不適合你,或者,但你仍然希望使用相同的形式:10

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

應該產生這個網站部分在新的和編輯的意見,你可以做這樣的事情:

= 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