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 

我的路线下的每个解决,但需要检查PARAMS [: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