Вам понадобится токен для использования в ссылке ... с миграцией добавьте поле 'токен' к элементу заказа (или как вы называете строку заказа)
rails g migration add_token_to_order_item token:token
Миграция и сгенерирует поле, и создаст индекс для быстрого поиска записи через токен. Также добавьте has_secure_token
в таблицу.
class OrderItem < ApplicationRecord
has_secure_token
...
end
Создайте маршрут для ссылки, которую вы включите в SMS или электронное письмо, сделайте это в route.rb
get 'enter_review/:token', to: 'reviews#enter_review'
Затем в вашем электронном письме или SMS-сообщении вы увидите ...
<%= link_to nil, enter_review_reviews_url(@order_item.token) %>
nil
приведет к отображению самой ссылки, поэтому вы можете добавить текст, например, "если вы не можете нажать на ссылку, скопируйте и вставьте ее в свой браузер ", если у них есть ограничительный почтовый клиент.
Убедитесь, что действие не требует входа в систему, изменив свой ApplicationController
class ApplicationController < ActionController::Base
before_action :authenticate_user!, unless: -> { customer_rating? }
private
def customer_rating?
params[:controller] == 'reviews' && params[:action] == 'enter_review'
end
end
И в вашем контроллере ReviewsController
у вас будет что-то вроде ...
class ReviewsController
def enter_review
@order_item = OrderItem.find_by(token: params[:token])
unless @order_item
# redirect to a "sorry, cannot find this order..." page and then return
end
...
end
end
Обратите внимание, что после того, как они введут обзор, они, вероятно, нажмут какую-нибудь кнопку Submit
, чтобы опубликовать действие ... Вам понадобится маршрут для этого действия, вам потребуется действие, определенное в вашем контроллере, и вам нужно будет расширить customer_rating?
, чтобы убедиться, что для действия после публикации не требуется вход пользователя в систему.
В конце вашего поста, сделайте ...
@order_item.regenerate_token
... который восстановит токен, чтобы ссылка на рейтинг была только один раз.