0

В моем приложении у меня есть 2 модели Foo и Bar. Foo 'has_one' Bar and Bar 'принадлежит_to' Foo.Rails 4 и simple_form для связанного маршрута

Мой файл маршрут выглядит следующим образом:

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» 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

Thanks @LongNguyen. Я попробовал это, и он действительно работает. Однако он потребует, чтобы у меня была отдельная форма для создания или редактирования моей записи, которую я пытаюсь избежать. – Herm

+0

В этом случае вы можете проверить, обновлено ли текущее действие или нет, а затем перейти на правильный путь. Я сейчас делаю это в своем проекте :) –

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 
Смежные вопросы