0

Ruby on Rails 3.2.2を使用していますが、プロセスフロー中に属性値が設定されているかどうかを確認する方法があるかどうかを知りたいです。つまり、属性、、、を持つクラスがArticleあります。titlecontentupdater_user_id

私のコントローラーには次のものがあります。

# @article.title
# => "Sample title"
# @article.content
# => "Sample content"
# @article.updater_user_id
# => 1

# @current_user.id
# => 1 # Note: This value is the same as '@article.updater_user_id'
@article.updater_user_id = @current_user.id

# params[:article]
# => {:article => {:title => 'Sample title 2', :content => 'Sample content 2'}}
@article.update_attributes(params[:article])

この方法を使用しようとしました@article.changedが、動作させたいので動作しません。実際、そのメソッドは次を返します。

@article.changed
# => ['title', 'content'] # Note: There isn't the 'updater_user_id' attribute

updater_user_idつまり、値が変更されていなくても、プロセスフロー中にが設定されているかどうかを確認したいと思います。私のユースケースは、オブジェクトを保存する前に、プロセスフロー中にを(少なくとも1回)設定することを要求したいというものです。プロセスフロー中に設定されていない場合は、エラーなどを発生させたいと思います。updater_user_idArticle

出来ますか?もしそうなら、それを作る方法は?

4

2 に答える 2

0

私はこれをテストしていません、そしていくつかの予期しない警告があるかもしれません、しかしあなたはおそらく次のようなことをすることができます:

def updater_user_id=(val)
  @updater_user_id_set = true
  write_attribute :updater_user_id, val
end

def updater_user_id_set?
  @updater_user_id_set || updater_user_id_changed?
end

def clear_updater_user_id_set
  @updater_user_id_set = false
end
private :clear_updater_user_id_set

after_save :clear_updater_user_id_set

これは、フィールドが更新されたことを示すフラグを保存するためにオーバーライドupdater_user_id=し、フィールドが設定されていることを確認するメソッドを備えています(おそらく、これを検証などで使用しますか?)。最後に、オブジェクトが保存されたときにフラグをクリアするためのフックが追加されます。

于 2012-05-05T17:36:27.007 に答える
0

方法を試しましたxxx_will_change!か?

# in Article class
  def updater_user_id=(new_updater_user_id)
    self[:updater_user_id] = new_updater_user_id
    updater_user_id_will_change!
  end
于 2012-05-05T18:55:33.693 に答える