Rails: Làm thế nào để lấy tên lớp mô hình dựa trên tên lớp bộ điều khiển?


Câu trả lời:


190

Điều này sẽ làm điều đó:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

Điều này thường cần thiết khi trừu tượng hóa các hành động của bộ điều khiển:

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 # trả về "Người mua nhà", cảm ơn!
Peter Ehrlich

1
ActiveSupport :: Inflector là tuyệt vời
Jared Beck

Tùy thuộc vào nhu cầu của bạn, (câu hỏi này không nêu rõ bất kỳ chi tiết nào), bạn có thể làm controller_name.sub('_', ' ').titleizeđể có được "Người mua nhà".
user664833 19/02/12

Có thể tốt nếu chuyển logic (để lấy lớp mô hình) vào một phương thức tiện ích riêng biệt. Thậm chí tốt hơn nếu kết quả được lưu trữ trong một hằng số, để tăng tốc độ truy cập. Bạn có thể sử dụng new.controller_name.classify.constantizetrong định nghĩa lớp.
Kelvin

Tôi nghĩ điều đáng chú ý là điều này thậm chí sẽ hoạt động trong bộ điều khiển ứng dụng tùy thuộc vào bộ điều khiển nào kế thừa từ nó.
Weltschmerz

40

Nếu bộ điều khiển và mô hình của bạn nằm trong cùng một không gian tên, thì điều bạn muốn là

controller_path.classify

controller_pathcung cấp cho bạn không gian tên; controller_namekhông.

Ví dụ: nếu bộ điều khiển của bạn

Admin::RolesController

sau đó:

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

6

Đó là một chút hack, nhưng nếu mô hình của bạn được đặt tên theo tên bộ điều khiển của bạn thì:

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

... sẽ cung cấp cho bạn "Người mua nhà" trong biến phiên bản @model_name của bạn.

Một lần nữa, điều này tạo ra một giả định lớn rằng "HouseBuyersController" chỉ giao dịch với các mô hình "Người mua nhà".


4

Để không gian tên hoạt động:

def resource_class
 controller_path.classify.constantize
end

0

Điều này không thể thực hiện được nếu bạn đang sử dụng MVC mặc định mà mã của bạn dường như không tuân theo. Bộ điều khiển của bạn có vẻ là một mô hình nhưng có thể bạn chỉ có một loại ở đó. Dù sao, bộ điều khiển và mô hình về cơ bản được tách biệt trong Rails MVC nên bộ điều khiển không thể biết chúng được liên kết với mô hình nào.

Ví dụ, bạn có thể có một mô hình có tên bài đăng. Điều này có thể có một bộ điều khiển posts_controller hoặc có thể có một bộ điều khiển như article_controller. Rails chỉ biết về các mô hình khi bạn xác định mã thực trong bộ điều khiển, chẳng hạn như

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

Trong bộ điều khiển tiêu chuẩn rails không có cách nào để biết mô hình là gì.


0

Giải pháp được chấp nhận không hoạt động với tôi vì bộ điều khiển và mô hình của tôi đã được đặt ở vị trí chung. Thay vào đó, tôi đã nghĩ ra phương pháp sau:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.