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
Другие вопросы по тегам