ruby-on-rails - 如何在没有登录rails的情况下获得评级?
解决方案
您需要在链接中使用令牌...通过迁移将字段“令牌”添加到订单项目(或您称之为订单行的任何内容)
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
...这将重新生成令牌,以便评级链接只有一次。
推荐阅读
- google-sheets - 将多行转换为 Google 工作表中的列
- elasticsearch - elasticsearch node.ROLE 配置
- angular - 我可以让 NgModule 提供其他 NgModule 吗?
- html - 尝试制作 div 格式以适合 svg 图像
- excel - 我的 VB.net 代码正在运行,但之后显示错误
- ios - 如何构建带有可折叠部分的表格视图?
- azure - 如何更改 Azure AD B2C phonefactor 的短信内容
- java - 如何避免在使用 System.exit 的 try/catch 附近出现“变量可能尚未初始化”
- swift - 包含一个命名参数的 Swift 方法的选择器
- django - Django - 如果我在视图中将 2 个表单集放在一起,则添加多次相同视图的功能不起作用