【问题标题】:How can I use a bingInt (as string) as a parameter?如何使用 bingInt(作为字符串)作为参数?
【发布时间】: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


    【解决方案1】:

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

    从那时起将 session_id 的类型更改为字符串,ActiveRecord 将 session_id 映射为字符串

    【讨论】:

    • 我已经这样做了,它现在是一个 varchar(255),所以我应该为参数设置一个 varchar,但看起来它认为它是一个整数
    • 您是否销毁并重新创建了数据库?您还应该在会话和设计表中进行更改
    • 不,我没有销毁表,而是通过迁移对其进行了更新,然后重新启动了服务器。由于我设法保存了@devi.session_id,我认为从现在开始它是一个字符串
    • @devi = Devi.find(params[:session_id].to_s) 你为什么要使用这个? Devi.find(expect a Devi.id) 并且你传递给它一个 session_id
    • 我改变了我的路线,如我的问题所示:路线应该等待:id,而不是:session_id,但我不知道为什么它仍然要求错误消息中的 ID..
    猜你喜欢
    • 2020-10-31
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2011-12-11
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多