2012-10-07 111 views
1

只是出於好奇:這個Rails代碼如何被重構?

這個(相當醜陋的)Rails代碼怎麼能美化/重構:

def section_link(name, path)  
    link = link_to(name, path) 
    if name != controller.controller_name.titlecase 
    link 
    else 
    link_to(name, path, :class => 'current') 
    end 
end 
+0

我們有一個姊妹網站,回答代碼審查問題:http://codereview.stackexchange.com/ - 如果你想我可以在遷移問題在那裏,你可能會得到更多的答案,其中一個可能比接受的答案還要好。 – Kev

回答

6
def section_link(name, path) 
    options = {} 
    options[:class] = 'current' if name == controller_name.titlecase 
    link_to name, path, options 
end 
+0

優秀的,這個得到了最多的票,所以我決定去爲它。謝謝! – Tintin81

+0

還不錯...但是有些程序員會在這個'options'中選擇'{}'並在之後修改。請注意,您可以編寫完全等效的單行表達式'options = name == controller_name.titlecase? {:class =>'current'}:{}' – tokland

+0

@tokland我不確定。如果它將「選項」完全更改爲其他內容,那麼我同意你將其初始化爲一個值,然後將其更改爲另一個值將非常可取! (說它可以是'42'或''答案'') –

0
def section_link(name, path)  
    if name != controller_name.titlecase 
    link_to(name, path) 
    else 
    link_to(name, path, :class => 'current') 
    end 
end 

或者這樣

def section_link(name, path) 
    link_to(name, path, :class => "#{"current" if name == controller_name.titlecase }") 
end 

不要的東西覺得它真的需要重構壽,如果它的工作...

+0

-1更好地解釋了...... – apneadiving

+0

如果它是一個明顯錯誤的anwer,則給出-1。 –

+0

我的觀點太...至少你有我的+1 :) – apneadiving

5

我會寫:

def section_link(name, path) 
    is_current = (name == controller.controller_name.titlecase) 
    link_to(name, path, :class => ('current' if is_current)) 
end 

理由:1)的可變is_current使得代碼稍微更聲明性的。 2)link_to假設nil表示空的類(我們在這裏想要的)。

+0

+1,這裏真正的附加價值。 – apneadiving

+0

謝謝,看起來真不錯! – Tintin81

1

你可以做這樣的事情:

def section_link(name, path) 
    link_to(name, path, class: name == controller.controller_name.titlecase ? "current" : nil) 
end 

但這種情況正在變得有點難以閱讀。我會分裂類判定爲另一種方法:

def section_link(name, path) 
    link_to(name, path, class: class_for(name)) 
end 

def class_for(name) 
    name == controller.controller_name.titlecase ? "current" : nil 
end 
+0

好吧,你也可以使用變量。如果'class_for'被使用了很多次,那麼如果它只用了一次,那就太過分了。 – tokland

0
def section_link(name, path)  
    link_to(name, path, 
    *({class: "current"} if name == controller.controller_name.titlecase)) 
end 
+0

我不確定這個*會起作用... – tokland

+0

@tokland在splat中''nil'擴展到缺少Ruby 1.9。除了數組之外的其他任何東西都會擴展到它自己。 – sawa

+0

當它不是零時會發生什麼? > helper.link_to(「a」,「b」,*({:class =>「myclass」})) NoMethodError:未定義的方法'stringify_keys'for [:class,「myclass」]:Array – tokland