Rails 4从控制器执行相关的模型方法

时间:2015-03-12 20:25:01

标签: ruby-on-rails ruby

假设我们有一个代码:

型号:

class Dog < ActiveRecord::Base
  def self.make_noise
    puts 'bow-wow'
  end
end

控制器:

class DogsController < ApplicationController
  def index
    Dog.make_noise
  end
end

这会有效,但我更愿意编写控制器index方法代码,例如:AssociatedModel.make_noiseModel.make_noise

在Rails中是否可以调用关联的模型方法而不在代码中使用其类名?

如果我想使用继承并且让PetsController成为所有宠物的基础(或者每个适用的控制器都包含PetNoise Concern)并声明索引方法,那么这将非常有用。

我不确定我是否已经解释得这么好了。

行。单向(我不喜欢)就是这样编写PetsController方法:

def index
  params[:controller].classify.constantize.make_noise
end

这样,如果我从PetsController继承DogsController,它仍然可以在DogsController内定义单独的索引的情况下继续工作。但也许还有其他更简洁的解决方案。

1 个答案:

答案 0 :(得分:1)

正如我在this answer中所解释的那样,您可以使用params[:controller]来确定模型。像这样:

params[:controller] # => "dogs"
params[:controller].classify # => "Dog"

因此,您可以编写索引操作&#34;通常&#34;像这样:

def index
  model_class = params[:controller].classify.constantize
  model_class.make_noise
end