如何将选中的Tab传递给Rails控制器的category_type私有方法?
解决动态Tab参数传递的方案
没问题,我来帮你实现不用硬编码的动态Tab参数传递!核心思路就是在点击Tab时通过URL传递参数,然后控制器从params里读取这个参数来设置@category_type,具体步骤如下:
1. 修改Tab视图,传递参数到控制器
先更新你的_tabs.html.haml,在link_to里添加category_type参数,这样点击不同Tab时会把对应的类型传到后台:
#secondary-slider.pills-container %span = link_to 'Questions', question_category_path(category_type: 'question'), class: @selected_tab[:question] %span = link_to 'Answers', answer_category_path(category_type: 'answer'), class: @selected_tab[:answer]
2. 重构控制器的category_type方法
把原来硬编码的逻辑改成从params里读取参数,还可以加个默认值防止参数缺失:
private def category_type # 把参数转成符号,默认值设为:question避免异常 @category_type = params[:category_type]&.to_sym || :question end
3. 调整Action里的Tab选中状态设置
现在可以在question和answer action里调用category_type方法获取动态值,再设置选中状态:
def question category_type @selected_tab = { @category_type => :selected } end def answer category_type @selected_tab = { @category_type => :selected } end
(可选)优化:用before_action减少重复代码
因为两个Action的逻辑几乎一样,你可以用before_action把公共逻辑抽出来,让代码更简洁:
class CategoryController < ApplicationController # 两个Action都执行这个前置方法 before_action :set_category_context def question # 这里可以写question特有的逻辑,如果有的话 end def answer # 这里可以写answer特有的逻辑,如果有的话 end private def set_category_context @category_type = params[:category_type]&.to_sym || :question @selected_tab = { @category_type => :selected } end end
额外建议:合并路由减少冗余
如果question和answer的业务逻辑高度相似,还可以把两个路由合并成一个,用参数区分类型,进一步简化代码:
路由修改:
# config/routes.rb resources :categories do get ':category_type', action: :show, on: :collection, as: :tab end
视图修改:
#secondary-slider.pills-container %span = link_to 'Questions', tab_category_path(category_type: 'question'), class: @selected_tab[:question] %span = link_to 'Answers', tab_category_path(category_type: 'answer'), class: @selected_tab[:answer]
控制器只保留一个show Action:
def show @category_type = params[:category_type]&.to_sym || :question @selected_tab = { @category_type => :selected } # 这里根据@category_type处理对应的业务逻辑,比如查询不同的数据 end
这样就完全摆脱了硬编码,实现了根据用户点击的Tab动态设置@category_type的需求啦!
内容的提问来源于stack exchange,提问作者Moriarty
相关产品推荐
相关产品推荐

