2012-07-01 69 views
1

如何製作動態變量名稱/對象?Rails:用於多態控制器/模型的包裝實例變量

我有一個多態模型,用於在批准時發送請求和加入模型。 用戶可以加入公司,項目或組等的示例。

所以我有一個屬性模型belongs_to各種模型,但我只想要關係建立一旦請求被接受。

profile.rb

class Profile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 
    has_many :requests 
    has_many :requested, as: :requestable 

    attr_accessible :first_name, :last_name 


    validates :first_name, presence: true 
    validates :last_name, presence: true 

end 

我需要我的控制器能夠基於它是處理模型以應用於其行動。

我一直希望用@ profile。@ belongs_to和@ profile.company是一樣的,在這種情況下,它就是nill。然後從@ profile。@ belongs_to = @requestable

因爲配置文件總是屬於它加入的模型@belongs_to將始終是小寫的模型名稱。

我一直在搞亂髮布到閃存消息的對象的內容,試圖弄清楚這一點。

requests_controller.rb

class RequestsController < ApplicationController 
before_filter :load_requestable 
    def accept 
     @request = Request.find(params[:id]) 
     @profile = Profile.find(@request.profile.id) 

     redirect_to [@requestable, :requests], notice: "#{@[email protected]_to} #{@request.profile.first_name} #{@request.profile.last_name} id: #{@request.profile.id} wants to join #{@requestable.name} id: #{@requestable.id}" 
    end 

    private 

    def load_requestable 
     klass = [Company, Profile].detect { |c| params["#{c.name.underscore}_id"]} 
     @requestable = klass.find(params["#{klass.name.underscore}_id"]) 
     @belongs_to = klass.to_s.downcase 
    end 
end 

我已經在控制檯的線沿線打得四處財產以後:

profile = Profile.first 
profile.company = Company.first 

,這將創建在隨後可以保存對象的連接。

回答

2

如果@belongs_to包含您的關聯中,你可以簡單的調用@profile.send(@belongs_to)或在分配中@profile.send("#{@belongs_to}=",@requestable)

#send允許你發送任何消息給任何紅寶石對象的情況下。想想動態方法調用。

而你應該完成

相關問題