Как получить рейтинг без логина в рельсах? - PullRequest
0 голосов
/ 20 января 2020

Я хотел бы отправить клиенту ссылку для оценки через смс или электронную почту. Например, я планирую использовать данный код . Это должно работать только один раз, и страница должна открываться без входа в систему. Пожалуйста, пролите немного света на это.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Вам понадобится токен для использования в ссылке ... с миграцией добавьте поле 'токен' к элементу заказа (или как вы называете строку заказа)

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

... который восстановит токен, чтобы ссылка на рейтинг была только один раз.

0 голосов
/ 22 января 2020

В маршрутах 'enter_review', to: 'transport_plans # enter_review' В application_controller.rb:

класс ApplicationController

before_action: authenticate_user !, кроме: [: enter_review]

Я получаю ошибку ниже

Запущен GET "/ enter_review" для 192.168.43.102 в 2020-01-22 23:37:01 +0530 Обработка TransportPlansController # enter_review как HTML Завершено 401 Несанкционированный в 6 мс (ActiveRecord: 0,0 мс)

0 голосов
/ 20 января 2020

Добавьте два поля в модель клиента:

  1. translation_id - идентификатор подтверждения uniq,
  2. подтверждено - логическое, по умолчанию false

После этого отправьте на ссылка пользователя с publi c url как www.yoursite.com/confirmation?confirmation_id=cb3cdd6

в Подтверждении_контроллере вы можете добавить что-то вроде этого, например:

def create
  user = User.find_by(confirmation_id: params[:confirmation_id])
  user.update(confirmed: true) if user.present? && !user.confirmed

  (some redirects and other actions)
end
...