将`.for()`提取到方法中

时间:2015-05-21 09:30:51

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有一个类似这样的课程:

class House

   def bricks
      Brick.for(@house_plan).where(size: 5)
   end

   def wood
       Wood.for(@house_plan).where(size: 5)
   end
end

我的目标是摘录电话 for(self).where(size: 5)

我首先尝试的是:

  class House

   def bricks
      Brick.match_material
   end

   def wood
       Wood.match_material
   end

   def match_material
       for(@house_plan).where(size: 5)
   end

end

但后来我收到了这个错误:

syntax error, unexpected '\n', expecting :: or '[' or '.'

然后我将代码更改为:

   def match_material
       .for(@house_plan).where(size: 5)
   end

现在我做的时候:

 house = House.new(HousePlan.new)
 house.bricks

我收到此错误:

formal argument cannot be an instance variable

在这一行:for(@house_plan).where(size: 5)

我错了什么?

2 个答案:

答案 0 :(得分:6)

您的方法不对,请记住match_material方法将始终在您自己的上下文中调用。我会这样做:

def bricks
  match_material(Brick)
end

def wood
  match_material(Wood)
end

def match_material(klass)
  klass.for(@house_plan).where(size: 5)
end

答案 1 :(得分:0)

出于好奇:

def bricks
  klazz = Kernel.const_get(__callee__[0...-1].capitalize)
  klazz.for(@house_plan).where(size: 5)
end
alias :woods :bricks

注意:在这种方法中,别名方法应始终如一地命名(brickswoods。)除非您了解自己在做什么,否则请不要在生产中使用它。