如何使用bingInt(作为字符串)作为参数?

时间:2017-09-13 23:09:56

标签: ruby-on-rails parameters routes

所以我正在创建一个系统,访问者可以向我的客户询问音乐作品。用户开始填写包含详细信息等的表单,当他提交时,它尚未发送给我的客户。但是,他可以估计价格,并根据需要修改他的需求。之后,他仍然可以最后一次提交,这次,估计被发送。

我不想将默认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作为字符串呈现给我的控制器的参数?或者我有更好的选择吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我认为session_id是数据库中的int,然后是你应该进行更改的地方。

将session_id的类型更改为字符串,并将ActiveRecord映射session_id作为字符串从那时开始