You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:07:09