3

不幸的是,我想不出一个很好的方法来写这个问题,我们有很多代码最终看起来像这样:

@annotation.note = params[:annotation][:note] if params[:annotation][:note]
@annotation.style = params[:annotation][:style] if params[:annotation][:style]

我发现如果最后检查参数很烦人。

那么有没有办法更简洁地写这个,以便理解该值仅在它存在时才被复制,而不必每次都在末尾明确询问是否?

4

6 回答 6

2
x = params[:annotation][:note] and @annotation.note = x
x = params[:annotation][:style] and @annotation.style = x
于 2012-11-28T11:41:46.697 回答
1

您可以轻松地将检查提取到方法中,从而使您的代码更加干燥。像这样,例如:

def copy obj, prop, params
  val = params[prop]
  obj.send "#{prop}=", val if val
end

ann = params[:annotation]
copy @annotation, :node, ann
copy @annotation, :style, ann
于 2012-11-28T10:27:32.313 回答
1

你也可以试试这个:

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

一些测试:

require 'ostruct'

@annotation = OpenStruct.new
params = {:annotation => {:note => 'note', :style => 'style'}}

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

p @annotation
#<OpenStruct note="note", style="style">

@annotation = OpenStruct.new
params = {:annotation => {:note => nil, :style => 'style'}}

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

p @annotation
#<OpenStruct style="style">

@annotation = OpenStruct.new
params = {:annotation => {:note => 'note'}}

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

p @annotation
#<OpenStruct note="note">
于 2012-11-28T11:17:57.533 回答
0
params[:annotation][:note].tap{|v| @annotation.note = v if v} 
params[:annotation][:style].tap{|v| @annotation.style = v if v}
于 2012-11-28T10:37:16.120 回答
0

这里还有另一种方法:

@annotation.note = params[:annotation][:note] || @annotation.note

我承认,您确实重复了,@annotation.note但语句长度仍然减少了。

于 2012-11-28T10:43:45.363 回答
-1

这是另一个尝试:

@annotation.note = params[:annotation][:note] rescue nil

@annotation.notenil如果params[:annotation][:note]不存在,将保留。

于 2012-11-28T11:07:07.907 回答