Ruby on Rails简易下拉框刷新后无法通过Cookie保留选中值
我来帮你搞定这个Cookie保存选中货币的问题~你的核心问题出在select_tag的用法和Cookie的读写逻辑上,咱们一步步来修复:
1. 修正前端下拉框的写法
你当前的select_tag参数逻辑有误,第一个参数应该是表单字段名,而选中状态要通过options_for_select的第二个参数指定。另外你的选项数组格式也不完整,每个选项需要是「显示文本+对应值」的结构。修正后的表单代码如下:
<%= form_tag "/cryptos/currency_selector", method: :post do %> <%= select_tag :selected_currency, options_for_select([ ['美元 (USD)', 'USD'], ['日元 (JPY)', 'JPY'], ['澳元 (AUD)', 'AUD'], ['欧元 (EUR)', 'EUR'] # 可按需添加更多货币选项 ], cookies[:currency_symbol] || 'USD'), class: "your-custom-class" %> <%= submit_tag "切换货币" %> <% end %>
这里的关键是options_for_select的第二个参数:cookies[:currency_symbol] || 'USD',意思是如果Cookie里有保存的货币值就用它,否则默认选中USD。
你需要在cryptos_controller.rb里的currency_selector方法中,正确接收表单值、验证合法性并写入Cookie(还要确保Cookie能被全站页面读取):
class CryptosController < ApplicationController def currency_selector # 定义允许的货币白名单,防止恶意值写入Cookie allowed_currencies = ['USD', 'JPY', 'AUD', 'EUR'] selected_currency = params[:selected_currency] if allowed_currencies.include?(selected_currency) # 设置Cookie,有效期30天,根路径确保全站可访问 cookies[:currency_symbol] = { value: selected_currency, expires: 30.days.from_now, path: '/' } end # 重定向回原页面(若无来源页则跳转首页) redirect_to request.referer || root_path end end
3. 路由配置检查
别忘了在config/routes.rb里添加对应的POST路由,确保表单能正确提交到控制器方法:
post '/cryptos/currency_selector', to: 'cryptos#currency_selector'
常见问题排查
- 检查Cookie是否生效:打开浏览器开发者工具(F12)→「Application」→「Cookies」,查看是否存在
currency_symbol,值是否和选中的货币一致。 - 若使用Rails 7+的Turbo:表单可能需要添加
data: { turbo: false }来强制页面刷新,确保Cookie值能立即生效:<%= form_tag "/cryptos/currency_selector", method: :post, data: { turbo: false } do %>
内容的提问来源于stack exchange,提问作者apuente
相关产品推荐
相关产品推荐

