Rails:为多态控制器/模型包装实例变量

时间:2012-07-01 12:22:02

标签: ruby-on-rails ruby wrapper instance-variables

如何制作动态变量名称/对象?

我有一个多态模型,用于在批准后发送请求和加入模型。 用户可以加入公司,项目或组等的示例。

所以我有一个属于各种模型的配置文件模型,但我只想在接受请求后建立关系。

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的模型,所以它将始终是小写的模型名称。

我一直在搞乱发布到flash消息的对象的内容,试图弄清楚这一点。

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: "#{@profile.@belongs_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 

然后在对象中创建连接,然后可以保存。

1 个答案:

答案 0 :(得分:2)

如果@belongs_to包含您的关联,您可以简单地致电@profile.send(@belongs_to),或者在分配时@profile.send("#{@belongs_to}=",@requestable)

#send允许您向ruby中的任何对象发送任何消息。想想动态方法调用。

你应该完成