Отношение has_one без nested_form

Я пытаюсь реализовать отношение has_one через базовую форму, и я застреваю полностью.

Кажется, я пробовал огромное количество комбинаций вещей в контроллерах и формах, но, похоже, никуда не денется.

У меня есть номер телефона, для которого я использую внешний сервис, заполненный API.

В конце концов, я бы хотел, чтобы все телефонные номера этого типа были настроены для этого, но сейчас я был бы рад получить только один рабочий.

parent.rb

has_one :clever_phone

И модель телефона

clever_phone.rb

attr_accessible :number, :parent_id, :prefix, :country_iso
belongs_to :parent

контроллер

clever_phones_controller

def new
@parent = Parent.find(params[:parent_id])
@clever_phone = @parent.build_clever_phone


def create

@parent = Parent.find(params[:parent_id]
@clever_phone = Parent.create_clever_phone(params[:clever_phone])

Представление Я действительно не хочу делать вложенную форму от родителя здесь, так как у меня есть некоторый сложный код, который генерирует информацию, используемую при создании, через API, который, как мне кажется, правильно расположен в clever_phones_controller

@simple_form_for @clever_phone do |f|

= f.input :country_iso, as: :country, :iso_codes => true, priority: ["gb"]
= f.input :prefix

= f.submit

Маршруты

 resources :parent do
   resource :clever_phone
 end

Моя проблема в том, что параметры для @parent, похоже, не передаются методу create в контроллере, и поэтому я получаю сообщение об ошибке "Не удается найти родителя без идентификатора".

Если я пытаюсь использовать его как вложенную форму, я получаю неопределенный метод NoMethodError 'parent_clever_phones_path' Когда на самом деле я не использовал его, только parent_clever_phone_path (обратите внимание на отсутствие множественного числа).

Я уверен, что это должно быть действительно просто, но я смотрю на это часами и нахожусь в конце моей привязи...

Есть идеи?

2 ответа

Хорошо, есть несколько вопросов, с которыми вам нужно бороться:

-

переменная

Причина по которой @parent параметры не передаются, потому что вы не включили их в свою форму. Это где вложение ваших форм будет очень удобно - передать ваши parent params, и ваш clever_phone параметры в один вызов

Поскольку вы не хотите этого делать, я бы рекомендовал, по крайней мере, заполнить hidden field с parent_id что clever_phone связан с:

#app/views/clever_phones/new.html.erb
= simple_form_for @clever_phone do |f|

= f.input :parent_id, as: :hidden, value: params[:parent_id]
= f.input :country_iso, as: :country, :iso_codes => true, priority: ["gb"]
= f.input :prefix
= f.submit

-

маршрут

Кроме того, вы должны убедиться, что вы можете создать правильный маршрут для вашей формы (как я думаю, @parent = Parent.find params[:parent_id] не вызывается на ваш create метод:

#app/views/clever_phones/new.html.erb
= simple_form_for [@parent, @clever_phone] do |f|

Это даст вам возможность указать create действие с вложенной версией вашего маршрута; следовательно, обеспечивая parent_id парам для вас

-

Написав это, я не думаю, что это решит суть вашей проблемы. Если вам нужна дополнительная информация, пожалуйста, напишите комментарий, и я с радостью постараюсь создать более подходящий ответ!

Справа: стоит добавить решение, которое наконец сработало. Спасибо Ричу Пеку за то, что он привел меня на полпути... модель

parent.rb
  has_one :clever_phone

clever_phone.rb
  belongs_to :parent  

Посмотреть

simple_form_for @clever_phone, url: parent_clever_phone_path(@parent) do |f|

-----
f.input :parent_id, :value: @parent.id
-----

маршруты

 resources :parent do
   resource :clever_phone

контроллер

def new 
....
@parent = Parent.find(params[:parent_id])
@clever_phone = @parent.build_clever_phone

def create
@parent = Parent.find(params[:parent_id]
@clever_phone = CleverPhone.new(params[:clever_phone]

Если вы не выполните build_clever_phone, parent_id не будет заполнен. Я не мог заставить @ parent.create_clever_phone работать, но это, похоже, помогло...

Надеюсь, это сэкономит кому-то день работы...

Другие вопросы по тегам