首页 > 解决方案 > 如何在没有登录rails的情况下获得评级?

问题描述

我想通过短信或电子邮件向客户发送评价链接。例如,我打算使用给定的代码。这应该只工作一次,页面应该在没有登录的情况下打开。请给它一些亮点。

谢谢。

标签: ruby-on-railsrating

解决方案


您需要在链接中使用令牌...通过迁移将字段“令牌”添加到订单项目(或您称之为订单行的任何内容)

rails g migration add_token_to_order_item token:token

迁移将生成字段并创建索引以通过令牌快速检索记录。也添加has_secure_token到表中。

class OrderItem < ApplicationRecord
  has_secure_token
  ...
end

为您将包含在 SMS 或电子邮件中的链接创建一个路由,在 routes.rb 中执行此操作

get 'enter_review/:token', to: 'reviews#enter_review'

然后在您的电子邮件或短信中,您将拥有...

<%= 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

...这将重新生成令牌,以便评级链接只有一次。


推荐阅读