Rails: Denetleyici sınıfı adına göre model sınıfı adı nasıl alınır?


Yanıtlar:


190

Bunu yapacak:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

Bu genellikle denetleyici eylemlerini soyutlarken gereklidir:

class HouseBuyersController < ApplicationController

  def index
    # Equivalent of @house_buyers = HouseBuyer.find(:all)
    objects = controller_name.classify.constantize.find(:all)
    instance_variable_set("@#{controller_name}", objects)
  end

end

@model_name = controller_name.classify # "HouseBuyers" döndürüyor teşekkürler!
Peter Ehrlich

1
ActiveSupport :: Inflector harika
Jared Beck

İhtiyaçlarınıza bağlı olarak (bu soru herhangi bir ayrıntı belirtmez), controller_name.sub('_', ' ').titleize"Ev Alıcıları" almak için yapabilirsiniz .
user664833

Mantığı (model sınıfını elde etmek için) ayrı bir yardımcı yönteme taşımak iyi olabilir. Erişimi hızlandırmak için sonuç sabit olarak saklanırsa daha da iyi. new.controller_name.classify.constantizeSınıf tanımında kullanabilirsiniz .
Kelvin

Bunun hangi denetleyiciden miras aldığına bağlı olarak uygulama denetleyicisinde bile çalışacağını belirtmekte fayda var.
weltschmerz

40

Denetleyiciniz ve modeliniz aynı ad alanındaysa, istediğiniz şey

controller_path.classify

controller_pathsize ad alanını verir; controller_namedeğil.

Örneğin, denetleyiciniz

Admin::RolesController

sonra:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT

6

Bu biraz hack, ancak modelinizin adı kontrol cihazınızın adıyla alınıyorsa:

class HouseBuyersController < ApplicationController
  def my_method
    @model_name = self.class.name.sub("Controller", "").singularize
  end
end

... size @model_name örnek değişkeninizde "HouseBuyer" verir.

Yine, bu "HouseBuyersController" ın yalnızca "HouseBuyer" modelleriyle ilgilendiğini varsayar.


4

Çalışan ad alanları için:

def resource_class
 controller_path.classify.constantize
end

0

Kodunuzun takip etmediği varsayılan MVC'yi kullanıyorsanız bu mümkün değildir. Denetleyiciniz bir model gibi görünüyor ama belki de orada bir tipiniz var. Her neyse, denetleyiciler ve modeller Rails MVC'de temelde ayrılmıştır, bu nedenle denetleyiciler hangi modelle ilişkili olduklarını bilemezler.

Örneğin, post adında bir modeliniz olabilir. Bunun bir post_controller denetleyicisi olabilir veya makaleler_controller gibi bir denetleyiciye sahip olabilir. Rails, yalnızca denetleyicideki gerçek kodu tanımladığınızda, örneğin

def index
  @posts = Post.all
  @posts = Article.all
end  

Raylarda standart kontrolörlerde modelin ne olduğunu bilmenin bir yolu yoktur.


0

Denetleyicim ve modelim ad alanlı olduğundan kabul edilen çözüm benim için işe yaramadı. Bunun yerine şu yöntemi buldum:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.