如何在Rails搜索功能中添加单选按钮实现搜索结果范围筛选
Rails带单选筛选的搜索功能实现方案
1. 修复视图代码
首先修正原有视图的拼写错误、参数配置问题,单选按钮参数会随表单自动提交到后端,不需要额外处理传递逻辑:
<div class="form"> <%= form_with url: search_path, method: 'get' do |form| %> <div class="search"> <%= form.text_field :search, value: params[:search] %> <%= form.submit "Search" %> </div> <div class="radio"> <%= form.label :search_check_box, "全部" %> <%= form.radio_button :search_check_box, :all, checked: params[:search_check_box].nil? || params[:search_check_box] == 'all' %> <%= form.label :search_check_box, "公开" %> <%= form.radio_button :search_check_box, :public, checked: params[:search_check_box] == 'public' %> <%= form.label :search_check_box, "未公开" %> <%= form.radio_button :search_check_box, :not_public, checked: params[:search_check_box] == 'not_public' %> </div> <% end %> </div>
- 修复点:删除label多余的value配置、修正
not_publick拼写错误、增加选中状态回显,提交表单后选中的单选值会自动存入params[:search_check_box]传递到控制器。
2. 修改控制器代码
新增单选参数的传递,把筛选范围传递给模型搜索方法:
def search @movies = Movie.search(params[:search], params[:search_check_box]) end
3. 修改模型搜索方法
组合关键词和范围条件完成筛选:
class Movie < ApplicationRecord def self.search(keyword, scope) # 先处理范围筛选 result = case scope when 'public' then where(public: true) when 'not_public' then where(public: false) else all end # 再处理关键词搜索 if keyword.present? result = result.where('name LIKE ?', "%#{keyword}%") end result end end
- 注意:以上代码假设你的Movie模型存在
public布尔类型字段用来标识公开状态,如果字段名不同请自行替换。
内容的提问来源于stack exchange,提问作者Beginner Professional
相关产品推荐
相关产品推荐

