0

重複の可能性:
Ruby on Railsコールバック、:before_saveと:before_createの違いは何ですか?

Ruby onRailsの現在のIDを/1、/ 2、/3などからランダムに生成されたURL(たとえば/ csd8dsv68dvs)に置き換えたいと考えています。

それを作成することを検討した後、私はポストモデルでこれを見つけました

before_create { self.code = SecureRandom.hex(5) }

before_createは何をし、ランダムIDを実装するにはどうすればよいですか?

アップデート

一部間違っているようです。IDを変更するつもりはありません。URLを、ユーザーが推測できないランダムな文字列に変更したいだけです。

4

3 に答える 3

3

:idルートを介した識別子はfriendly_idであるため、リソースの代替手段を提供するのに役立つ優れた宝石です。RailsCastもあります。

before_createActiveRecordコールバックであり、ここSO(他の人がコメントしているように)とAPIの両方でよく説明されています。

生を使用することを選択した場合

before_create { self.code = SecureRandom.hex(5) }

コントローラのアクションを変更して、IDの代わりにこのコードを使用してリソースを見つけることができます。

def some_action
  @resource = ModelClass.find_by_code!(params[:id])
end

:codeビュー内のリソースのルートに属性を渡します

resource_path(@resource.code)

resource_pathリソースのルートメソッドはどこにありますか。

于 2012-12-05T21:46:07.010 に答える
2

Rails IDを置き換えることは強くお勧めしますが、URLを予測しにくいものに変更したい場合は、正しい方向に進んでいます。

これは、 FriendlyIDgemなどで何度も解決されてきた「きれいなURL」を作成することで解決される問題と非常によく似ています。おそらく、宝石をフォークして「UnfriendlyID」と呼びたいと思うでしょう:-)

宝石が箱から出してすぐに機能するかどうかに関係なく、方法は簡単です。コードを読んで、それを書いた人から学びましょう。

于 2012-12-05T21:48:40.217 に答える
0

私は他の2つのポスターに同意します。おそらくこれはしたくないでしょう。FriendlyIDは、レコードの代替IDを操作するための優れた方法を提供します。そうは言っても、本当にIDを置き換えたい場合は、それを変更するだけです。

thing = Thing.new
thing.id = some_random_number_generator()
thing.save!

これは、ActiveRecordでの作成時のIDのオーバーライドですでに説明されています。正当な理由がない限り、それを行わないことを真剣に検討してください。

于 2012-12-05T21:55:16.797 に答える