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

Ruby on Rails中如何向admin/highlights视图传递年份参数

解决方法:修正按钮请求方式并传递年份参数

你的问题根源在于button_to默认会发起POST请求,而admin_highlights_path的POST路由对应的是create动作(这就是为什么你会看到ActionController::ParameterMissing错误——create动作期望接收Highlight的创建参数,但你只是想跳转查看列表)。要解决这个问题,需要调整按钮的请求方式为GET,并正确传递年份参数。

方案1:直接修改按钮(无需改动路由)

把button_to的请求方法指定为:get,同时通过查询参数传递年份ID:

<td>
  <%= button_to 'Highlights', admin_highlights_path(year_id: year.id), method: :get, class: 'btn btn-sm btn-default' %>
</td>

然后在Admin::HighlightsController的index动作中,根据参数筛选对应年份的Highlight:

class Admin::HighlightsController < ApplicationController
  def index
    if params[:year_id].present?
      # 找到对应的年份,关联获取其所有Highlight
      @year = Year.find(params[:year_id])
      @highlights = @year.highlights
    else
      # 没有传递年份时显示全部Highlight
      @highlights = Highlight.all
    end
  end
end

方案2:添加RESTful集合路由(更规范的命名)

如果你希望URL更具语义化,可以在路由中给Highlights添加一个集合路由:

namespace :admin do
  root 'pages#show', id: 'dashboard'
  # ...其他路由
  resources :highlights do
    collection do
      # 添加按年份筛选的路由
      get 'by_year/:year_id', to: 'highlights#by_year', as: :by_year
    end
  end
  # ...其他路由(years等)
end

接着在控制器中新增by_year动作,复用index视图:

class Admin::HighlightsController < ApplicationController
  def index
    @highlights = Highlight.all
  end

  def by_year
    @year = Year.find(params[:year_id])
    @highlights = @year.highlights
    # 复用index的视图模板
    render :index
  end
end

最后修改按钮指向这个新路由:

<td>
  <%= button_to 'Highlights', admin_highlights_by_year_path(year.id), method: :get, class: 'btn btn-sm btn-default' %>
</td>

这两种方案都能实现你的需求,方案1更快捷无需改动路由,方案2的URL结构更清晰(比如会生成/admin/highlights/by_year/2024这样的地址)。

内容的提问来源于stack exchange,提问作者Fernando Maymone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:42:16