2013-07-04 28 views
20

Tôi đang chạy Rails 4.Tiếp cận hằng số mô hình cụ thể trong một cái nhìn Rails

Tôi có một mô hình gọi là Challenge, và trong cơ sở dữ liệu của tôi, tôi đang lưu trữ các status của mỗi thách thức về mặt 0-4.

Nhưng 0-4 không phải là rất ngữ nghĩa vì vậy tôi muốn xác định một vài biến (Tôi giả định một hằng số) để trong bất kỳ điều khiển hoặc xem tôi có thể truy cập bằng cách gọi số hằng số:

# Challenge.rb 
class Challenge < ActiveRecord::Base 
    SUGGESTED = 0 
    APPROVED = 1 
    OPEN = 2 
    VOTING = 3 
    CLOSED = 4 
end 

tôi muốn truy cập những quan điểm của tôi:

# challenge/_details.html.erb 
<% if @challenge.status == CLOSED %> 
    Challenge is closed, broheim! 
<% end %> 

Nhưng quan điểm của tôi không muốn để render.

uninitialized constant ActionView::CompiledTemplates::CLOSED 

Cách tốt nhất để đặt biến trạng thái của tôi để chúng có thể được truy cập ở mọi nơi tôi cần chúng là gì? (Tức là, bất cứ nơi nào biến @challenge hiện diện)

+2

tôi khuyên bạn nên sử dụng một Hash là một hằng số trong trường hợp này. Tại sao? Bởi vì nó sẽ làm giảm số lượng các hằng số khác nhau của mô hình của bạn. Một cái gì đó như: 'STATUSES = {đề xuất: 0, được chấp thuận: 1, mở: 2, v.v. ..}' và truy cập vào nó như 'Challenge :: STATUSES.approved' – MrYoshiji

Trả lời

41

Bạn nên truy cập chúng như sau:

Challenge::CLOSED 

Kể từ CLOSED thường xuyên của bạn được định nghĩa trong một lớp, bạn cần truy cập vào liên tục sử dụng toán tử phân giải phạm vi. Vì vậy, nếu quan điểm của bạn, bạn sẽ kiểm tra nó như:

# challenge/_details.html.erb 
<% if @challenge.status == Challenge::CLOSED %> 
    Challenge is closed, broheim! 
<% end %> 
+1

Đó là một chút dự phòng nếu câu lệnh if của tôi đã được tham chiếu biến @challenge. Có cách nào để làm điều đó có nghĩa ngữ nghĩa nó đọc như tiếng anh không? – alt

+0

Hey thanx điều này rất hữu ích cho tôi. –

9

Đó là một ý tưởng thực sự tồi khi viết loại câu lệnh này: đối tượng của bạn phải xử lý logic của chính nó. Hãy tưởng tượng nếu một ngày nào đó bạn quyết định hợp nhất trạng thái, bạn có thay đổi mọi điều kiện trong codebase của mình không? Không, bạn nên sử dụng một phương pháp xử lý logic.

Tôi muốn làm như sau:

class Challenge < ActiveRecord::Base 
    SUGGESTED = 0 
    APPROVED = 1 
    OPEN = 2 
    VOTING = 3 
    CLOSED = 4 

    #defines: 
    # - suggested? 
    # - approved? 
    # - ... 
    %w(suggested approved open voting closed).each do |state| 
    define_method "#{state}?" do 
     status == self.class.const_get(state.upcase) 
    end 
    end 

    #if you prefer clarity, define each method: 

    def suggested? 
    status == SUGGESTED 
    end 

    #etc... 
end 

Sau đó, theo quan điểm của bạn:

<% if @challenge.closed? %> 
+0

Không có vẻ rất ngữ nghĩa. Nó cũng khá một số lượng khó hiểu của mã để có trong mô hình của một dự án mã nguồn mở. Có lẽ bạn có thể giải thích lý do tại sao ý tưởng của @ MrYoshiji lại rất tệ? – alt

+2

Không phải là một việc lớn để tạo ra các phương thức nếu chúng có ý nghĩa, tốt hơn nhiều so với đặt logic bên ngoài bên ngoài mô hình. @MrYoshiji ý tưởng là tốt bằng cách này. – apneadiving

+0

btw, làm thế nào nó có thể có nhiều ngữ nghĩa hơn '@ challenge.closed? '? – apneadiving

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