Отношение 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 работать, но это, похоже, помогло...
Надеюсь, это сэкономит кому-то день работы...