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
相关产品推荐
相关产品推荐

