Rails 3 - 重构红宝石条件

时间:2011-04-20 08:41:01

标签: ruby-on-rails ruby ruby-on-rails-3 refactoring

我想知道在ruby中是否有更简单的方法来执行这两个条件:

if params[:action] == 'index' || params[:action] == 'show'

if !(comment = (session[:my_params].include?(:comment) rescue nil)).nil?

提前致谢

4 个答案:

答案 0 :(得分:7)

对于第一个,您可以这样做:

if %w(index show).include?(params[:action])

第二个应该重新计算为两行:条件检查中的赋值是代码气味;从来没有理由。

如果您使用的是Rails / ActiveSupport,则可以利用Object#try

comment = session[:my_params].try(:include?, :comment)
if comment
  # ... comment is in scope
end

否则,你会留下一些略显笨拙的东西:

comment = session[:my_params].include?(:comment) rescue nil
if comment
  # etc

答案 1 :(得分:1)

1:

if ['index','show'].include? params[:action]

2:

if (comment = (session[:my_params].include?(:comment) rescue nil))
第二个条件中的

!.nil?是多余的

但是,实际上,你不应该尽量缩短所有内容,首先要关心的是你的代码对其他人的清晰程度。第二个条件应该是:

if ( comment = (session[:my_params] && session[:my_params].include?(:comment) )

甚至

comment = session[:my_params] && session[:my_params].include?(:comment)
if comment 

答案 2 :(得分:0)

第一个可以这样折射:

if ['index', 'show'].include? params[:action]

if %w(index show).include? params[:action]

答案 3 :(得分:0)

这应该比使用数组和include?

更快
case params[:action]; when 'index', 'show'
   ...
end

第二个:

if comment = (session.fetch(:my_params, {}).include?(:comment))