【发布时间】:2017-09-13 23:09:56
【问题描述】:
所以我正在创建一个系统,访问者可以在其中向我的客户索要音乐作品。用户开始填写包含详细信息等的表单,当他提交时,它还没有发送给我的客户。但是,他可以估算价格,并根据需要修改他的需求。之后,他还可以最后一次提交,这一次发送估计。
我不想使用默认 id 作为参数,因为如果 url 看起来以 /3 或 /4 结尾,那么“解析”其他估计就太简单了。您只需要尝试几个 URL,如果这是您的幸运日,您就可以“破解”一个不属于您的估计。我打算在一段时间后使用 cron 作业来删除这些估计,但我不想冒任何风险。
为了避免这种情况,我决定使用访问者的 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 作为字符串呈现给我的控制器参数?还是我有更好的选择?
谢谢
【问题讨论】:
标签: ruby-on-rails parameters routes