Создание уникального токена для ссылки, доступ к которой возможен только по указанной ссылке? - PullRequest
0 голосов
/ 07 января 2019

Проблема : У меня есть страница подтверждения заказа после размещения заказа. Маршрут выглядит так:

resources :orders do
      get 'order_confirmation', :on => :member
  end

Ссылка :

example.com/orders/1001/order_confirmation

Вместо я хотел бы создать уникальную ссылку, подобную этой:

example.com/orders/1001/order_confirmation/79sa9182-sd9871234123456f

Поэтому, если кто-то делает заказ на заказ 1002, он не может сказать: «Эй, дай мне посмотреть, что сделал заказ 1001».

Кстати, подтверждение_приказа находится в контроллере Orders , как это :

  def order_confirmation
    @order = Order.find(params[:id])
  end

У меня есть такая защита для пользователей, вошедших в систему с помощью CanCanCan, но я создал эту страницу order_confirmation для людей, которые не создают учетные записи и, вероятно, никогда не будут создавать учетную запись.

Как я могу сделать это так, как ссылка:

example.com/orders/1001/order_confirmation/79sa9182-sd9871234123456f

Генерируется для подтверждения заказа и ссылок, подобных этой:

example.com/orders/1001/order_confirmation/

не может быть доступен никому, даже покупателю?


Я нашел это: Защищенная ссылка для обмена в Ruby on Rails

Но я не уверен, как бы я применил это для страницы подтверждения заказа, так как у нее нет собственной таблицы или модели. Это уже в OrdersController

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Преимущество использования friendly_id - все работает из коробки. Если вы добавите use: [:slugged, :finders] к модели, вам не нужно заботиться о том, что использовать - id или slug. Оба варианта работают:

Order.find(1)
Order.find('my_first_order')

Генерация uuids с friendly_id - не очень распространенная практика, я использовал ее, так как у нас уже был этот драгоценный камень в нашем проекте. Похоже:

class Order < ApplicationRecord
  extend FriendlyId
  friendly_id :blank_string, use: [:slugged, :finders]

  private

  def blank_string
    ''
  end
end

Если вам не нужны слизни для другой модели, было бы проще добавить новый столбец token в таблицу заказов со значением по умолчанию default: 'uuid_generate_v4()' и индексом для столбца. Не забудьте включить расширение 'uuid-ossp'.

А вот хорошая статья о плюсах и минусах uuids в качестве первичных ключей. Вкратце: «Лучшее из обоих? Внутренние целые числа, Внешние идентификаторы UUID»

0 голосов
/ 16 января 2019

Вот так я решил проблему to_param. Я просто удалил его и реорганизовал маршруты для конкретного маршрута участника .....

При использовании:

resources :orders, param: :order_token do get 'order_confirmation', :on => :member end

В моих маршрутах я могу перейти по URL, который я хочу. Хотя после создания заказа он все же направляет меня к маршруту с использованием: id.

Затем я изменяю свое перенаправление на:

redirect_to order_confirmation_order_path(@order.order_token)

И это работает.

Я также удалил переопределение to_param.

0 голосов
/ 07 января 2019

Я предполагаю, что 79sa9182-sd9871234123456f - это код или что-то еще, что вы храните где-то.

Тогда вам нужно изменить ваши маршруты следующим образом:

resources :orders do
  get 'order_confirmation/:code' => 'orders#order_confirmation', :on => :member
end

Затем вы можете создать ссылку на страницу подтверждения заказа с вашим новым путем, например:

your_new_path(id: <order_id>, code: <your_code>)
...