Rails 4 и simple_form для связанного маршрута
В моем приложении у меня есть 2 модели Foo и Bar. Foo 'has_one' Bar & Bar 'принадлежит_to' Foo.
Мой файл маршрута выглядит так:
namespace :baz do
resources :foo do
resources :bar
end
end
Я использую гем simple_form. Таким образом, для вложенного маршрута, подобного указанному выше, я ожидаю, что сработает следующее:
= 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 ответа
С simple_form_for
Вы можете указать URL формы, используя url
приписывать. Попробуй это:
= simple_form_for @bar, url: edit_baz_foo_bar_path do |f|
Я не уверен, что путь, который я пишу выше, является правильным, пожалуйста, посмотрите в ваших маршрутах, запустив rake routes
,
Это должно прекрасно работать:
= 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