Ruby on rails 如何重构这段Rails代码?

Ruby on rails 如何重构这段Rails代码?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,只是出于好奇: 如何美化/重构这段(相当难看的)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 或者类似的事情 def section_link(na

只是出于好奇:

如何美化/重构这段(相当难看的)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  
或者类似的事情

def section_link(name, path)
  link_to(name, path, :class => "#{"current" if name == controller_name.titlecase }")
end
不要认为它真的需要重构,如果它能工作的话

def section_link(name, path)
  options = {}
  options[:class] = 'current' if name == controller_name.titlecase
  link_to name, path, options
end
或者类似的事情

def section_link(name, path)
  link_to(name, path, :class => "#{"current" if name == controller_name.titlecase }")
end
不要认为它真的需要重构,如果它能工作的话

我会写:

def section_link(name, path)
  options = {}
  options[:class] = 'current' if name == controller_name.titlecase
  link_to name, path, options
end
def section_link(name, path)
  is_current = (name == controller.controller_name.titlecase)
  link_to(name, path, :class => ('current' if is_current))
end
理由:1)变量
是当前的
使代码更具声明性。2)
link\u to
假设
nil
表示空类(我们在这里想要的)。

我要写:

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

理由:1)变量
是当前的
使代码更具声明性。2)
link\u to
假设
nil
表示空类(我们在这里想要的)。

您可以这样做:

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

你可以这样做:

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


我也没有得到-1。我非常喜欢第一个片段而不是第二个片段(这段代码太长,并且有点不清楚的字符串插值)。我非常喜欢第一段而不是第二段(这段代码太长,并且有点不清楚的字符串插入)。很好,这段代码获得了最多的选票,所以我决定选择它。谢谢不错。。。但是一些程序员会首先选择
选项
,然后再进行修改。注意,您可以编写完全等效的一行表达式
options=name==controller\u name.titlecase?{:class=>'current'}:{}
@tokland我不确定。如果它将
选项
全部更改为其他值,那么我同意您的看法,将其初始化为一个值,然后将其更改为另一个值将是非常糟糕的!(假设它可以是
42
“答案”
)@Andy。至少它不会改变它的类型。但是有一个问题:当你做数学时,如果你写
x=1
,你会把
x
,换成2,然后在相同的范围内吗?不,那没有任何意义。为什么在编程时(这只是实际的数学)它是有意义的?(我的观点:)。太好了,这一次获得了最多的选票,所以我决定去参加。谢谢不错。。。但是一些程序员会首先选择
选项
,然后再进行修改。注意,您可以编写完全等效的一行表达式
options=name==controller\u name.titlecase?{:class=>'current'}:{}
@tokland我不确定。如果它将
选项
全部更改为其他值,那么我同意您的看法,将其初始化为一个值,然后将其更改为另一个值将是非常糟糕的!(假设它可以是
42
“答案”
)@Andy。至少它不会改变它的类型。但是有一个问题:当你做数学时,如果你写
x=1
,你会把
x
,换成2,然后在相同的范围内吗?不,那没有任何意义。为什么在编程时(这只是实际的数学)它是有意义的?(我的观点:)。嗯,你也可以使用变量。如果
class\u for
被多次使用,那没关系,如果只使用一次,那就太过分了。如果
class\u for
被多次使用,那没关系,如果只使用一次,那就太过分了。@tokland
nil
带有splat,在Ruby 1.9中扩展为不存在。数组以外的任何东西都会扩展到自身。当它不是零时会发生什么helper.link_to(“a”,“b”,“*({:class=>“myclass”}))NoMethodError:未定义[:class,“myclass”]的方法“stringify_keys”:Array@tokland带有splat的
nil
在Ruby 1.9中扩展为缺席。数组以外的任何东西都会扩展到自身。当它不是零时会发生什么helper.link_to(“a”,“b”,“*({:class=>“myclass”}))NoMethodError:undefined方法` stringify_keys'for[:class,“myclass”]:array我们有一个姐妹站点,可以回答代码复查问题:-如果你愿意,我可以将你的问题迁移到那里,你可能会得到更多的答案,其中一个可能比公认的更好。我们有一个姐妹网站,回答代码审查问题:-如果你愿意,我可以将你的问题迁移到那里,你可能会得到更多的答案,其中一个可能比公认的更好。