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