如何修改请求路径中的参数变量名并隐藏或伪装参数值?
Rails 路由传参伪装/隐藏解决方案
仅修改参数名(伪装参数key)
如果只需要修改URL里参数的变量名,直接调整路由辅助方法内的参数key即可:
<%= link_to 'Checkout', article_path(自定义参数名: price.id) %>
比如你把参数key改成pid,生成的URL就会变为http://localhost:3000/article?pid=price_1Kdamcakraj,对应控制器侧取值时改为读取params[:pid]即可。
隐藏参数真实值(参数仍在URL中)
如果需要隐藏price_1Kdamcakraj这个真实值,可以对参数值做可逆加密混淆,Rails内置了开箱即用的加密工具:
- 先在辅助方法中添加加密逻辑
# 写入 app/helpers/application_helper.rb def encrypt_value(value) Rails.application.message_encryptor.encrypt_and_sign(value.to_s) end
- 控制器侧添加解密逻辑
# 对应articles控制器内添加 private def decrypt_value(encrypted) Rails.application.message_encryptor.decrypt_and_verify(encrypted) end
- 修改link_to代码
<%= link_to 'Checkout', article_path(price: encrypt_value(price.id)) %>
此时URL里的参数值会变为加密后的乱码,无法直接读取原始id,控制器拿到参数后先解密再使用即可。
完全隐藏参数(不暴露在URL)
如果不想参数出现在地址栏中,可以将GET请求改为POST请求,参数会放在请求体中传输:
<%= link_to 'Checkout', article_path, method: :post, params: { price: price.id } %>
需要注意同步修改config/routes.rb里对应接口的请求方法为POST,控制器侧仍可正常通过params[:price]取值。
内容的提问来源于stack exchange,提问作者Samuel Da Costa
相关产品推荐
相关产品推荐

