2010-09-08 27 views
33

Tôi biết tôi có thể dễ dàng viết một hàm và đặt nó trong bộ điều khiển ứng dụng, nhưng tôi không muốn nếu có cái gì khác thực hiện điều này. Về cơ bản tôi muốn có một cái gì đó như:Rails (hoặc Ruby): Có/Không thay vì True/False

>> boolean_variable? 
=> true 
>> boolean_variable?.yesno 
=> yes 
>> boolean_variable?.yesno.capitalize 
=> Yes 

có điều gì đó như thế này đã có trong khung Rails không?

+0

http://stackoverflow.com/questions/15047745/how-to-implement-yes-no-instead-of-boolean-for-certain-cases-in-rails – Hugo

Trả lời

35

Không built-in helper như vậy tồn tại, nhưng nó trivially dễ thực hiện:

class TrueClass 
    def yesno 
    "Yes" 
    end 
end 

class FalseClass 
    def yesno 
    "No" 
    end 
end 
+1

Hey, đó là slicker sau đó những gì tôi đã có thể đến với. Theo như một ứng dụng đường ray có liên quan, nơi nào là nơi tốt nhất để đặt mã này? trong một tập tin dưới lib hoặc một cái gì đó? – DJTripleThreat

+0

Tôi sẽ tạo một trình khởi tạo tùy chỉnh trong đường dẫn config/initializer có tên "boolean_path.rb". Bằng cách đó, các phương pháp mới này sẽ có sẵn thông qua ứng dụng. Chúc mừng! – Eytan

+1

@Eytan Tôi mới đến ruby ​​và đường ray và tôi đang cố gắng gắn bó với quy ước nhưng tôi không biết làm thế nào để tạo ra một intializer, bạn có thể giúp tôi với nó? Về cơ bản những gì tôi sẽ đặt trong boolean_path.rb đó và làm thế nào tôi có thể sử dụng nó? Những gì tôi muốn làm là khi tôi tạo mô hình của tôi, tôi muốn sử dụng t.boolean_yesno thay vì boolean thông thường và có đầu ra Có hoặc Không thay vì True hoặc False. Nếu bạn thích tôi mở một câu hỏi khác cho điều này cho tôi biết. – GiH

14

Ngoài ra, bạn cũng có thể làm một sự đánh đổi trong quan điểm của bạn như:

<%= item.bool_field? ? 'yes' : 'no' %> 
+1

Đây không phải là rất DRY, so với các giải pháp khác và sẽ rất khó để bản địa hóa. –

+5

Không, Jeff, bạn hoàn toàn đúng. Tôi đã nói chuyện với * một * offs, và không để * nhiều * offs, và trong trường hợp sau này, một người trợ giúp tất nhiên sẽ là khôn ngoan hơn (và DRY) tùy chọn, như bạn chỉ ra. – patrickhawley

+0

Hoàn hảo! Tôi có một ứng dụng biểu mẫu, vì vậy tôi không quan tâm đến nội địa hóa/DRY (chưa). Cảm ơn vì điều đó. –

34

Có isn' t một cái gì đó trong Rails.

Một cách tốt hơn so với việc thêm vào/classes sai sự thật để đạt được một cái gì đó tương tự sẽ được thực hiện một phương pháp trong ApplicationHelper:

def human_boolean(boolean) 
    boolean ? 'Yes' : 'No' 
end 

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

<%= human_boolean(boolean_youre_checking) %> 

phương pháp Thêm vào các lớp dựng sẵn thường bị cau mày. Ngoài ra, cách tiếp cận này phù hợp chặt chẽ với những người trợ giúp của Rails như raw().

Ngoài ra, một lần tắt không phải là một ý tưởng tuyệt vời vì chúng không dễ bảo trì (hoặc được kiểm tra).

+0

Thực hiện chính xác điều đó. Cảm ơn! –

20

Có một viên ngọc cho rằng bây giờ: humanize_boolean

Sau đó, bạn chỉ cần làm:

true.humanize # => "Yes" 
false.humanize # => "No" 

Nó cũng hỗ trợ quốc tế, do đó bạn có thể dễ dàng thay đổi chuỗi trở lại bằng cách bao gồm dịch của bạn cho en.boolean. yes và en.boolean.no (hoặc bất kỳ địa mà bạn thích)

+1

+1 Cảm ơn, Mike! – DJTripleThreat

11

các humanize_boolean ngọc mở rộng TrueClass, FalseClassNilClass đó là một phần mở rộng tôi gián tiếp muốn tránh.

tôi đã tìm thấy helper này với một dịch cấp cao nhất được cách ly, thân thiện để thay đổi và bạn có thể cung cấp cho nó bất cứ điều gì truthy hoặc falsey:

# app/helpers/application_helper.rb 
class ApplicationHelper 
    def humanize_boolean(boolean) 
    I18n.t((!!boolean).to_s) 
    end 
end 

# config/locales/en.yml 
en: 
    :true: 'Yes' 
    :false: 'No' 

Làm !!(boolean).to_s đảm bảo biến được truyền cho đối số được hoặc là một Giá trị "true" hoặc "false" khi tạo chuỗi dịch.

Trong sử dụng:

# app/views/chalets/show.html.erb 
<%= humanize_boolean(chalet.rentable?) %> 
Các vấn đề liên quan