2008-12-11 40 views
21

Tôi có một số dữ liệu mà tôi muốn lưu trữ ở đâu đó trong ứng dụng Rails của mình vì tôi sử dụng nó để tạo các trường biểu mẫu, kiểm tra biểu mẫu đã gửi để đảm bảo giá trị của nó hợp lệ, v.v. Về cơ bản, tôi muốn dữ liệu một vị trí bởi vì tôi sử dụng nó ở một vài nơi.giá trị hằng số trong Rails

Trước đây, tôi đã xác định phương thức initialize trong bộ điều khiển và khởi tạo biến mẫu trong phương thức đó, ví dụ: @graph_types = ['bar', 'line']. Điều này có vẻ là một ý tưởng tồi bởi vì đó thực sự là tất cả initialize đã được sử dụng cho (khởi tạo các giá trị đó) và các biến cá thể có thể được thay đổi sau đó, mà tôi không muốn.

Bây giờ, tôi xác định các hằng số bên ngoài bất kỳ phương pháp nào trong bộ điều khiển của tôi, ngay lên trên cùng sau bộ lọc của tôi và tôi cố định chúng, ví dụ: GraphTypes = ['bar', 'line'].freeze.

Tôi không muốn lưu trữ dữ liệu đó trong tệp cấu hình vì sau đó tôi sẽ phải theo dõi tệp phụ, đọc trong tệp và phân tích cú pháp, v.v. Tôi không muốn lưu trữ dữ liệu này trong cơ sở dữ liệu bởi vì điều đó có vẻ như quá mức cần thiết; Tôi không cần phải thực hiện bất kỳ truy vấn loại LEFT OUTER JOIN nào kết hợp các loại biểu đồ có sẵn với một hằng số khác của tôi, giả sử Themes = ['Keynote', 'Odeo', '37 Signals', 'Rails Keynote'].freeze. Tôi không muốn lưu trữ dữ liệu trong môi trường.rb vì dữ liệu này chỉ liên quan đến một bộ điều khiển cụ thể.

Xem xét tất cả điều này, tôi sẽ nói về 'cách Ruby' này?

Trả lời

9

Tôi tin rằng những gì bạn hiện đang làm là tốt; bạn nói rằng dữ liệu chỉ liên quan đến một bộ điều khiển, và do đó đó là nơi nó thuộc về. Nếu nó là cần thiết cho nhiều bộ điều khiển, hoặc nếu chúng phức tạp hơn các giá trị không đổi, các cách tiếp cận khác có thể có ý nghĩa.

4

Có, những gì bạn đang làm là tốt. It's Ruby thành ngữ hơn để gọi hằng số của bạn GRAPH_TYPES mặc dù.

Ngẫu nhiên, tôi sẽ tránh xác định initialize trong bộ điều khiển của bạn. Có vẻ như nó có thể dẫn đến rắc rối.

1

Nếu bạn đang tạo biểu mẫu có liên quan đến một số tài nguyên thì đó sẽ là biến thể tốt để lưu trữ nó trong các mô hình. Bạn không cần phải lưu trữ nó trong DB vì nó có thể là lớp đơn giản hoặc các biến/phương thức của cá thể.

Ý tưởng tương tự là để xác thực. Nếu bạn đang xác nhận hợp lệ tài nguyên/trường hợp mô hình thì đó sẽ là lựa chọn hợp lý để lưu trữ các tham số xác thực bên trong lớp mô hình.

Dù sao, nó sẽ gần gũi hơn với mẫu 'mô hình dày và bộ điều khiển mỏng', sau đó bất kỳ biến thể nào bạn đã đề cập.

27

Đối với các hằng số không thực sự thuộc về bất kỳ nơi nào khác, tôi có lớp StaticData.

class StaticData 

    GRAPH_TYPES = ['bar', 'line'] 

    SOMETHING_ELSE = ['A', 'B'] 

    end 

Sau đó, tôi nhận được vào nó với

StaticData::GRAPH_TYPES 
+2

Nơi nào bạn đặt các lớp học? Bạn có định vị nó với các mô hình của mình không? – ahsteele

+3

Vâng, tôi đặt nó vào thư mục mô hình, nhưng nó có lẽ sẽ tốt hơn nếu đặt nó trong lib. – user37011

3

tôi sẽ đồng ý một số những gì với IDBD và paradisepete. Sử dụng hằng số trong mô hình sẽ là cách tốt nhất để đi để bộ điều khiển là gầy và chất béo mô hình. xem Rails view tips Ví dụ: nếu bạn có bộ điều khiển chỉ số được liên kết với một mô hình chỉ số.Trong mô hình số liệu lớp Metric < ActiveRecord :: Base GRAPHTYPES = [ 'bar', 'dòng']

Sau đó, trong giao diện bạn có thể làm một cái gì đó giống như

f.select: graph_type, Metric :: GRAPHTYPES

11

Câu trả lời tương tự I wrote previously to a similar question áp dụng và đăng khi câu trả lời này vẫn xuất hiện trong kết quả tìm kiếm.

Đặt hằng số trong bộ điều khiển có ý nghĩa như hằng số liên quan trực tiếp đến bộ điều khiển. Các hằng số nếu không được đặt trong tập tin khởi tạo chuyên dụng: Rails.root/config/initializers/constants.rb.

Theo nhận xét được liệt kê trong application.rb:

# Application configuration should go into files in config/initializers 
# -- all .rb files in that directory are automatically loaded 

This is still valid as of Rails 3.

+1

Sasha, bạn sử dụng phạm vi nào để xác định các constatns trong tệp 'config/initializers/constants.rb' của bạn? Bạn có đặt 'MAGIC_NUMBER = 42' ngay trong phạm vi toàn cục, bọc nó trong khối' mô-đun YourApp' hay cái gì khác? – evanrmurphy

+1

@evanrmurphy tùy thuộc vào bạn. Bao bọc các hằng số của bạn trong một không gian tên là an toàn nhất để tránh đặt tên các xung đột và cũng thêm ngữ cảnh bổ sung khi sử dụng các hằng số, nhưng một số người không thích không gian tên (tức là phạm vi toàn cầu). – Dennis

Các vấn đề liên quan