Rails路由错误与自定义放置操作

时间:2017-06-24 03:13:03

标签: ruby-on-rails ruby

我的索引页面上的每个项目都有复选框。我正在尝试实现一种归档功能,一旦用户完成了一个项目,他们可以勾选他们完成的记录框,然后点击一个按钮提交表格,切换每个项目的“打印” “布尔到假。

我的自定义操作“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

1 个答案:

答案 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 %>