/ / रूल्स केस स्टेटमेंट को यदि स्टेटमेंट - रूबी-ऑन-रेल्स, इफ-स्टेटमेंट, रूबी-ऑन-रेल्स -4, डेविस, स्विच-स्टेटमेंट

रेल बयान केस स्टेटमेंट तैयार करते हैं - रूबी-ऑन-रेल, अगर-स्टेटमेंट, रूबी-ऑन-रेल -4, डिवाइज, स्विच-कथन

मेरे आवेदन नियंत्रक में मुझे ए after_sign_in_path_for(resource) उपयोगकर्ता या व्यवस्थापक साइन इन करने के बाद साइनइन मार्ग को बदलने की विधि।

मैं उपयोगकर्ता साइन को रूट में बदलना चाहता हूं यदि उनके पास कोई वर्तमान पद हैं, हालांकि मैं इसे "केस स्टेटमेंट के रूप में काम करने के लिए प्राप्त कर सकता हूं और न ही एक if स्टेटमेंट के साथ। यह वही है जो वर्तमान में मेरे पास है और यह काम करता है;"

     def after_sign_in_path_for(resource)
case resource
when Admin then admin_root_path
when User then root_url
end
end

लेकिन मैं इसे इस तरह के एक बयान में बदलना चाहता हूं (या यदि आसान हो तो केस स्टेटमेंट), लेकिन यह काम नहीं करता है ...

 def after_sign_in_path_for(resource)
if resource == User
if current_user.posts.count == 1
post_path(1)
else
root_url
end
elsif resource == Admin
admin_root_path
end
end

उत्तर:

जवाब के लिए 0 № 1

रूबी में, केस स्टेटमेंट का उपयोग करता है मामला समानता ऑपरेटर ===। निम्नलिखित कोड पर विचार करें

>> User.new === User # false
>> User === User.new # true
>> User.new.is_a?(User) # true

case समानता के लिए जाँच करने के लिए दूसरे कोड का उपयोग करता है। यह जानकर आप अपने कोड को बदल सकते हैं

if resource.is_a?(User)
...
elsif resource.is_a?(Admin)
...
end

आप भी उपयोग कर सकते हैं === परंतु is_a? अधिक पठनीय है

if User === resource
...
elsif Admin === resource
...
end

ऐसा करने का एक और तरीका है और वह है संसाधन का वर्ग प्राप्त करना

if resource.class.name == "User"

यद्यपि आपको चेतावनी दी जाती है कि आप विरासत का उपयोग कर रहे हैं

class Foo; end
class Bar < Foo; end

bar = Bar.new

bar.is_a?(Foo) # true
Foo === bar # true