3

残念ながら、この質問を書くための本当に良い方法を思いつきませんでした。最終的に次のようになるコードがたくさんあります。

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

最後のチェックの if params が面倒だと思います。

それで、これをもっと簡潔に書く方法はありますか?

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

ここにも別の方法があります:

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

繰り返します@annotation.noteが、ステートメントの長さはまだ短縮されています。

于 2012-11-28T10:43:45.363 に答える
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 に答える
-1

別の試みを次に示します。

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

@annotation.note が存在しないnil場合は残ります。params[:annotation][:note]

于 2012-11-28T11:07:07.907 に答える