Rails控制器中如何实现同一页面交替加载两个视图?
嘿,我来帮你搞定这个交替渲染视图的问题~
你原来的代码里 render('alt_index' || 'index') 逻辑有问题:因为字符串 'alt_index' 在Ruby里永远是“真值”,所以这个表达式永远只会返回 'alt_index',自然每次都只会渲染这个视图啦。要实现交替加载,我们需要记住用户上次访问时看到的是哪个视图,Rails的session正好能帮我们在用户会话中保存这个状态。
解决方案代码
直接修改你的控制器动作就行,用session记录上次的视图,每次请求时切换:
class ComingSoonController < ApplicationController def index # 从session中取出上次记录的视图,首次访问时为nil last_view = session[:last_coming_soon_view] if last_view == 'alt_index' # 上次看的是alt_index,这次渲染index并更新session render 'index' session[:last_coming_soon_view] = 'index' else # 首次访问或上次看的是index,这次渲染alt_index并更新session render 'alt_index' session[:last_coming_soon_view] = 'alt_index' end end end
更简洁的写法
如果喜欢紧凑的代码,也可以用三元表达式简化:
class ComingSoonController < ApplicationController def index target_view = session[:last_coming_soon_view] == 'alt_index' ? 'index' : 'alt_index' render target_view session[:last_coming_soon_view] = target_view end end
逻辑说明
- 首次访问时,
session[:last_coming_soon_view]是空的,会默认渲染alt_index; - 刷新页面时,session里记录了上次的视图,会自动切换到另一个;
- session是和用户会话绑定的,不同用户之间的交替状态互不影响,完全符合需求。
内容的提问来源于stack exchange,提问作者SupremeA
相关产品推荐
相关产品推荐

