4

私は自分のコントローラーでこのコードをたくさん書いていることに気づいています:

params[:task][:completed_at] = Time.parse(params[:task][:completed_at]) if params[:task][:completed_at]

理由は毎回変わるので、私がここで行っていることにこだわる必要はありません。createしかし、パラメータの値をチェックして、またはに渡す前に変更する必要がある状況はたくさんありますupdate_attributes

3回繰り返すparams[:task][:completed_at]のはとても気分が悪いです。これを行うためのより良い方法はありますか?

4

3 に答える 3

11

これをわずかに短縮する1つの方法は次のとおりです。

if c = params[:task][:completed_at]
  params[:task][:completed_at] = Time.parse(c)
end

または、これを好むかもしれません:

params[:task][:completed_at] &&= Time.parse(params[:task][:completed_at])

2番目のケースでは、左側が「真実」である場合にのみ割り当てが行われます。

于 2010-01-14T23:04:32.237 に答える
0

私はRubyにあまり詳しくありませんが、RubyにはPerlのルーツがあるため、次のように記述できる構造がある可能性があります。

$_ = Time->parse($_) for params[:task][:completed_at] || ();

基本的に、forループを利用して、変数のエイリアスが存在する場合はそれを作成します

多分次のようなものです:

(params[:task][:completed_at] || ()).each { |i| i = Time.parse(i) }

編集:

Rubyにaliasキーワードがあるようです。私はRubyの例を示すのに十分な知識がありませんが、Perlでは上記のように書くこともできます。

local *_ = \$params[$task][$completed_at];

$_ = Time->parse($_) if defined;

$_これは、のエイリアスになることを指定します$params[$task][$completed_at]

Rubyで簡単に試してみましたが、識別子をエイリアスする方法が見つかりませんでした。グローバル変数だけです。

于 2010-01-15T18:35:50.760 に答える
0

私はあなたがこのようなことをすることを検討できると思います。

#to_timeStringとNilClassに実装します。おそらく、( Rubyのベストプラクティスextensions.rbで推奨されているように、たとえば

require 'time'
class String
  def to_time
    Time.parse(self) # add error/exception handling to taste
  end
end

class NilClass
  def to_time
    nil
  end
end

その後、電話をかけるだけparams[:task][:created_at].to_timeで重複がなくなります。

これが必ずしも「ベストプラクティス」を構成するかどうかはまったくわかりませんが、IMHOは質問の目的を満たしています...

于 2010-01-15T00:16:11.560 に答える