Ransack在Rails 5.2中路由至错误Action的问题排查
解决Ransack在expired_events视图中提交到Index Action的问题
这个问题的核心是Ransack的search_form_for默认会根据搜索对象关联的模型生成指向index action的路由,即使你在expired_events视图里使用了@expired_search,如果不明确指定表单提交的目标路径,它还是会默认跳转到events#index。
解决方案步骤:
1. 明确指定搜索表单的提交路径
修改expired_events.html.erb中的search_form_for,添加url参数指向你的expired_events action:
<%= search_form_for([:admin, @expired_search], remote: true, url: admin_events_expired_events_path ) do |f| %> <!-- 你的筛选表单字段 --> <div class="wrapper" id="event_listing"> <%= render partial: "/admin/events/events-list", locals: {events: @events} %> </div> <% end %>
注意:如果不确定路由名称,可以在终端运行
rails routes | grep expired_events查看正确的路由辅助方法名,比如可能是expired_events_admin_events_path,根据你的命名空间和路由配置调整。
2. 优化expired_events Action的代码逻辑
原来的代码逻辑有点冗余,建议先初始化Ransack搜索对象,再处理分页(先筛选再分页才是正确的逻辑):
def expired_events @category_list = Category.all.order(name: :asc) # 先基于过期事件初始化搜索对象 @expired_search = Event.where("expiry < ?", Time.now).ransack(params[:q]) # 获取搜索结果并排序、分页 @data = @expired_search.result(distinct: true).order(created_at: :desc) @events = @data.paginate(page: params[:page], per_page: 12) end
3. 验证效果
修改完成后,点击expired_events视图的筛选按钮,查看服务器日志:
- 应该显示请求路径为
/admin/events/expired_events - 渲染的模板是
expired_events.js.erb,而不是index.js.erb
这样就能让筛选请求正确走到expired_events action,返回对应的JS模板更新页面了。
内容的提问来源于stack exchange,提问作者Bradley
相关产品推荐
相关产品推荐

