0

新しいモデルの ID を持つパーマリンクを作成するにはどうすればよいですか?

例えば

animal = Animal.create(name: 'cool dog') #creates animal with id of 1 and name of dog

animal.permalink => "1-cool-dog"

IDが挿入されるように適切なコールバックを追加するにはどうすればよいですか? before_saveまたはafter_save動作しません

after_save :update_permalink #or before_save

def update_permalink
  self.permalink = "#{id} #{name}".parameterize
end

最終的には、「1-cool-dog」ではなく「cool-dog」が表示されます

そして、私はその理由を理解しています。after_save に保存せずに属性を設定しています。ただし、id が新しいレコードで作成されていないため、before_save でも機能しません。

4

2 に答える 2

1

おそらく、パーマリンクをデータベースに保存する必要はまったくありません。

def permalink
  "#{self.id} #{self.name}"
end

このアプローチでは、パーマリンクが読み取られるたびに ID と名前を連結することでモデルにパーマリンクを追加します。

于 2013-06-22T02:01:20.403 に答える
1

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.htmlによると

after_save の代わりに after_commit を使用する必要があります

保存と破棄の両方がトランザクションにラップされ、検証またはコールバックで行うことはすべて保護されたカバーの下で行われます。そのため、検証を使用してトランザクションが依存する値をチェックしたり、after_* コールバックを含むコールバックで例外を発生させてロールバックしたりできます。

その結果、データベースへの変更は、操作が完了するまで接続の外部には表示されません。たとえば、after_save で検索エンジンのインデックスを更新しようとすると、インデクサーは更新されたレコードを認識しません。after_commit コールバックは、更新がコミットされるとトリガーされる唯一のものです。下記参照。

上でコメントしたように、動物モデルの to_param メソッドを次のように単純にオーバーライドしたい場合があります。

def to_param
  "#{id}-#{name.parameterize}"
end

これにより、作成しようとしているパーマリンクのようにすべての URL が自動的に作成され、引き続き使用できますAnimal.find(params[:id])

于 2013-06-22T02:09:30.903 に答える