首页 > 解决方案 > 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]

我怎样才能生成路线?

附属问题,我做得对吗?

标签: ruby-on-railsroutes

解决方案


在此处找到此帖子的解决方案。

我需要重新启动服务器,以便在创建 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,解决的问题在这里


推荐阅读