我的索引页面上的每个项目都有复选框。我正在尝试实现一种归档功能,一旦用户完成了一个项目,他们可以勾选他们完成的记录框,然后点击一个按钮提交表格,切换每个项目的“打印” “布尔到假。
我的自定义操作“change_selected”应该接收通过参数更改的记录的ID,然后在每个记录上调用切换。
我遇到的问题是,当我尝试按原样提交此表单时,我收到路由错误,上面写着“没有路由匹配[PUT]”/“。感谢任何帮助。或者,如果有更好的方法,请告诉我!谢谢!
# items_controller.rb
def index
@items = Item.all.filter_by_status(params[:filter])
@download = Item.all
respond_to do |format|
format.html
format.csv {send_data @download.to_csv}
format.json {render :json => @download}
end
end
def change_selected
params[:to_change].each do |i|
Item.find_by_id(i).toggle(:print)
end
respond_to do |format|
format.html {redirect_to items_path}
end
end
路线
Rails.application.routes.draw do
root 'items#index'
resources :items do
collection do
post :import
put :change_selected
end
end
end
在我的索引视图中,这里是form_for标签,然后是
<%= form_for change_selected_items_path, method: :put do %>
<% item.each do |i| %>
<%= check_box_tag "to_change[]", i.id %>
<%= submit_tag "Change Selected" %>
<% end %>
rake routes:
Prefix Verb URI Pattern Controller#Action
root GET / items#index
import_items POST /items/import(.:format) items#import
change_selected_items PUT /items/change_selected(.:format) items#change_selected
items GET /items(.:format) items#index
POST /items(.:format) items#create
new_item GET /items/new(.:format) items#new
edit_item GET /items/:id/edit(.:format) items#edit
item GET /items/:id(.:format) items#show
PATCH /items/:id(.:format) items#update
PUT /items/:id(.:format) items#update
DELETE /items/:id(.:format) items#destroy
答案 0 :(得分:3)
我认为问题在于你使用form_for
- 文档说it's for updating attributes of a model object。它期望将模型名称作为符号或模型对象作为第一个参数,而是将它作为字符串给它一个路径。看起来它无法推断路径,因此它使用了根路径。如果您有兴趣,可以阅读rails如何从模型符号或对象推断更新路径。
相反,我建议实际上期望路径作为第一个参数的vanilla form_tag
helper。
<%= form_tag change_selected_items_path, method: :put do %>
<% item.each do |i| %>
<%= check_box_tag "to_change[]", i.id %>
<% end %>
<%= submit_tag "Change Selected" %>
<% end %>