/ / Prípadové vyhlásenie k železnici na vyhlásenie if - ruby-on-rails, if-vyhlásenie, rubín-on-rails-4, vymyslený, prepínač-vyhlásenie

Rails navrhuje vyhlásenie prípadu, ak vyhlásenie - ruby-on-rail, if-statement, rubín-na-koľajnice-4, vymyslieť, switch-vyhlásenie

V ovládači mojej aplikácie mám after_sign_in_path_for(resource) metóda na zmenu trasy prihlásenia po prihlásení používateľa alebo správcu.

Chcem zmeniť prihlásenie používateľa na trase v závislosti od toho, či má nejaké aktuálne príspevky, ale nemôžem ho donútiť, aby fungoval ako prípadový príkaz ani s príkazom if.To je to, čo momentálne mám a funguje to;

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

ale chcem ho zmeniť na príkaz if, ako je tento (alebo prípadový príkaz, ak je to jednoduchšie), ale toto nefunguje ...

 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

odpovede:

0 pre odpoveď č. 1

Vo veci Ruby sa v tomto prípade uvádza operátor pre prípad rovnosti ===, Zvážte nasledujúci kód

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

case používa druhý kód na kontrolu rovnosti. S týmto vedomím môžete zmeniť svoj kód na

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

Môžete tiež použiť === ale is_a? je čitateľnejší

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

Existuje iný spôsob, ako to urobiť, a to získaním triedy zdroja

if resource.class.name == "User"

Upozorňujeme vás, ak využívate dedičstvo

class Foo; end
class Bar < Foo; end

bar = Bar.new

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