ruby-on-rails - rails 5 基于模型属性的动态路由重定向
问题描述
我有以下资源
Places (:place_id, :name, :shortlink, :token)
Events (:event_id, :address)
我有一个嵌套用户资源的受限用户注册(用户有很多事件)。
当用户注册时,(s)他创建一个带有引用位置列的新事件。
用户只有在 url 中有这些参数时才能注册
https://mysite/user/signup?q=[:place_id]&t=[:token] # place id 必须存在,place token 必须等于 t 参数
before_action :check_has_access, only: [:new]
...
protected
def check_has_access
@place = Place.find(params[:q])
if params[:q].blank? && @place.blank? || params[:t].blank? || @place.token != params[:t]
redirect_to(root_path)
flash[:alert] = 'Restricted sign-up'
end
end
我想为每个地方生成一个快捷方式供用户注册
https://mysite/[:shortlink] #place.shortlink
这将重定向到具有相应填写表单和受限参数的给定注册表单,以便具有直接 url 的用户可以注册。
https://mysite/user/signup?q=[:place_id]&t=[:token]
我怎样才能生成路线?
附属问题,我做得对吗?
解决方案
在此处找到此帖子的解决方案。
我需要重新启动服务器,以便在创建 Place 对象后加载新创建的路由。不确定我是否做得对,但它有效..
#config/route.rb
Rails.application.routes.draw do
Place.all.each do |pl|
get "/#{pl.shortlink}" => redirect("/users/sign_up?q=#{pl.id}&t=#{pl.token}")
end
end
为了在添加地点时加载新创建的路线,我添加了
#models/place.rb
after_create :add_shortlink
...
def add_shortlink
Rails.application.reload_routes!
end
这不适用于 Heroku,解决的问题在这里
推荐阅读
- java - 仅在一种方法中重构函数重载方法
- java - 删除页码
- python - 为什么我的 tkinter 应用程序会显示 node.js 窗口?
- reactjs - 返回文本并将组件作为字符串返回
- .net - .net core 3.1 docker build CS0101 和 CS0579 错误
- javascript - 在 React + Redux 应用程序中渲染之前从服务器获取初始数据
- javascript - 试图保存 .vue 文件
- python - 使用 -O 将调试设置为 OFF 运行 python3
- typescript - Typescript 的 TypeGuard 在枚举器中丢失
- cron - 共享主机 cpanel cron 作业中 wget 命令的问题