QA@IT
«回答へ戻る

Fix typo

2
 生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。
 
 ```ruby
-user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)
+user.tokens.create!(uuid: SecureRandom.uuid, expired_at: 24.hours.since)
 
 user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
 ```

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end

1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

user.tokens.create!(uuid: SecureRandom.uuid)

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

/tokens/#{token.uuid}

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。

user.tokens.create!(uuid: SecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)

3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

token = user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

```ruby
class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end
```

## 1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

```ruby
user.tokens.create!(uuid: SecureRandom.uuid)
```

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

```
/tokens/#{token.uuid}
```

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

## 2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。

```ruby
user.tokens.create!(uuid: SecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
```

## 3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

```ruby
token = user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
```

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

## 4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

Rails的に、検索方法の書き方が間違っていたのを修正。findじゃなくてfind_by_uuid!でした。

887
 ```ruby
 user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)
 
-user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
+user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
 ```
 
 ## 3. URLへ2回以上アクセスした時、それを判断する方法
 単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。
 
 ```ruby
-token = user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
+token = user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
 token.update_attributes!(expired_at: Time.now)
 
 # 2回目は引けない。
-user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
+user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
 ```
 
 2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end

1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

user.tokens.create!(uuid: SecureRandom.uuid)

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

/tokens/#{token.uuid}

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。

user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)

3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

token = user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

```ruby
class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end
```

## 1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

```ruby
user.tokens.create!(uuid: SecureRandom.uuid)
```

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

```
/tokens/#{token.uuid}
```

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

## 2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。

```ruby
user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
```

## 3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

```ruby
token = user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find_by_uuid!(uuid)
```

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

## 4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

Fix typo

887
 
 ## 2. URLに有効期限を設ける方法
 
-生成時にexpired_atを指定しておいて、検索するときもそれを来にしながら検索すればいいです。
+生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。
 
 ```ruby
 user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end

1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

user.tokens.create!(uuid: SecureRandom.uuid)

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

/tokens/#{token.uuid}

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。

user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find(uuid)

3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

token = user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find(uuid)

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

```ruby
class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end
```

## 1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

```ruby
user.tokens.create!(uuid: SecureRandom.uuid)
```

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

```
/tokens/#{token.uuid}
```

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

## 2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを気にしながら検索すればいいです。

```ruby
user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
```

## 3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

```ruby
token = user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
```

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

## 4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

回答を投稿

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end

1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

user.tokens.create!(uuid: SecureRandom.uuid)

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

/tokens/#{token.uuid}

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを来にしながら検索すればいいです。

user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find(uuid)

3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

token = user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find(uuid)

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。

RubyとRailsでの回答ですみません。ただ、データの扱いとかは変わらないはずです。雰囲気でお願いします。

例えば、以下のようデータが有るとします。tokensテーブルにuuidとuser_id、expire_atというカラムがあると考えてください。

```ruby
class User < ActiveRecord::Base
  has_many :tokens
end

class Token < ActiveRecord::Base
  # uuid: string, expire_at: datetime
end
```

## 1. 登録したユーザごとに一意なURLを発行する方法

ふつうにDBにデータを作ります。一意でランダムなものなので、RubyでいうところのSecureRandomなどちゃんとしたものを使ってデータを作って下さい。(Rails的に、user_idも勝手に入ります)

```ruby
user.tokens.create!(uuid: SecureRandom.uuid)
```

で、このuuidをふくむURLを作ってあげればいいです。Railsのビューで言うと

```
/tokens/#{token.uuid}
```

など(Rails的にもっとキレイな書き方はありますが)。あとはそのURLへアクセスされた時にクエリパラメータ内のuuidをベースにtokensをひいて処理すればいいです。

## 2. URLに有効期限を設ける方法

生成時にexpired_atを指定しておいて、検索するときもそれを来にしながら検索すればいいです。

```ruby
user.tokens.create!(uuid: SerecureRandom.uuid, expired_at: 24.hours.since)

user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
```

## 3. URLへ2回以上アクセスした時、それを判断する方法

単純に、一回引いたあとにexpired_atをセットしてあげれば、以降はそのトークンは無効になります。

```ruby
token = user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
token.update_attributes!(expired_at: Time.now)

# 2回目は引けない。
user.tokens.where(['expired_at < ?', Time.now]).find(uuid)
```

2回以上のアクセスと有効期限切れを区別するのであれば、別カラムを用意して、使われたことを明記すると良いでしょう。

## 4. そもそもどんな言語で実装可能なのか

ということでいま言語生誕20周年&2.0リリースで盛り上がっているRubyを使った例で説明しました。
もちろんこの例の他にエラー処理やら何やら入りますが、基本的にはデータの持ち方の話になるので、実装言語はなんでもできます。

あとは要件次第ですかね。たとえば100req/secとかのリクエスト識別子を発行する仕組みなんかだとこの牧歌的な実装は使いづらいと思います。