所以我正在创建一个系统,访问者可以向我的客户询问音乐作品。用户开始填写包含详细信息等的表单,当他提交时,它尚未发送给我的客户。但是,他可以估计价格,并根据需要修改他的需求。之后,他仍然可以最后一次提交,这次,估计被发送。
我不想将默认ID用作参数,因为如果网址看起来以/3
或/4
结尾,那么“解析”其他估算会非常简单。你只需要尝试几个URL,如果这是你的幸运日,你就会“破解”一个不属于你的估计。我计划在一段时间后使用cron作业删除这些估算,但我不想承担任何风险。
为了避免这种情况,我决定使用visitor的session_id作为参数,我删除了每个字母字符,但仍然保存为MySQL 5.7数据库中的字符串,以便ActiveRecord可以正常使用。我也相应改变了路线,结果应该是
localhost:3000/devis/4724565224204064191099 # Devis means 'quotation' in french
然而,当我尝试到达此路线时,我收到以下错误:
ActiveRecord::RecordNotFound (Couldn't find Devi with an out of range value for 'id')
以下是我的控制器的相关部分:
devis_controller.rb
# ...
def create
@devi = Devi.new(devi_params)
respond_to do |format|
@devi.status = 'created'
@devi.session_id = session.id.gsub(/[^\d]/, '').to_s # How I store my parameter
# Latest record returns '4724565224204064191099'
if @devi.save
format.html { redirect_to @devi, notice: 'Devi was successfully created.' }
format.json { render :show, status: :created, location: @devi }
else
format.html { render :new }
format.json { render json: @devi.errors, status: :unprocessable_entity }
end
end
end
# ...
private
def set_devi
@devi = Devi.find(params[:session_id].to_s) # Tried '.to_s', didn't work
end
这是我的路线:
# 'index' and 'destroy' don't exist
resources :devis, only: %i(create update)
get '/devis/nouveau', to: 'devis#new', as: :devis_new
get '/devis/:session_id', to: 'devis#show', as: :devis_show
get '/devis/editer/:session_id', to: 'devis#edit', as: :devis_edit
我的问题如下:有没有办法将:session_id
作为字符串呈现给我的控制器的参数?或者我有更好的选择吗?
谢谢
答案 0 :(得分:0)
我认为session_id是数据库中的int,然后是你应该进行更改的地方。
将session_id的类型更改为字符串,并将ActiveRecord映射session_id作为字符串从那时开始