3

У меня есть полиморфная связь с адресом, в котором оба могут принадлежать члену или зависимому. Все выглядело великолепно, пока я не понял, что я не знаю, какой тип объекта создавал его, если я не пропущу что-то. Есть ли способ сообщить файлу маршрутизации включить тип объекта?Полиморфный контроллер и вызывающий объект

Модели:

class Member < ActiveRecord::Base 
    has_one :address, as: :person, dependent: :destroy 
end 

class Dependent < ActiveRecord::Base 
    has_one :address, as: :person, dependent: :destroy 
end 

class Address < ActiveRecord::Base 
    belongs_to :person, polymorphic: true 
end 

Контроллер:

def new 
    @person = ??? 
    @address = Address.new(person: @person) 
end 

Маршруты Сейчас:

resources :members do 
    resources :addresses, shallow: true 
    resources :dependents, shallow: true do 
     resources :addresses, shallow: true 
    end 
    end 

У меня есть маршруты для решения в рамках каждого, но должны были бы проверить для параметров [: member_id] или params [: dependent_id] Я думаю. Что происходит, когда я прикрепляю заметки ко всему. Я, вероятно, пропустил какой-то простой способ сделать это в Rails, любые советы будут очень благодарны!

ответ

9

В принципе, вы хотите установить объект person перед созданием адреса. Вы можете сделать это в адрес контроллера, как это:

В Адресной контроллера:

class AddressesController < ApplicationController 
    before_action :set_person 

    def new 
    @address = @person.build_address 
    end 

    def set_person 
    klass = [Member, Dependent].detect{|c| params["#{c.name.underscore}_id"]} 
    @person= klass.find(params["#{klass.name.underscore}_id"]) 
    end 
end 

Что касается файла маршрутов, в настоящее время в соответствии с отношениями, которые вы определили в своих моделях следующих должно работать:

resources :members do 
resource :address #singular resource routing as its a has_one relationship 
end 

resources :dependents do 
    resource :address #singular resource routing as its a has_one relationship 
end 

(Обратите внимание, что я использовал особую маршрутизацию для вложенного ресурса Вы можете прочитать больше о ней здесь:. http://guides.rubyonrails.org/routing.html#singular-resources)

Смежные вопросы