Edit multiple records, controller & routing
I am following railscast 198 http://railscasts.com/episodes/198-edit-multiple-individually, trying to update it to rails 3, and am stuck with a routing error. The route http://localhost:3000/orders/edit_individual gives me the error:
ActiveRecord::RecordNotFound in OrdersController#show - Couldn't find Order with ID=edit_individual
I have updated and used his rails 2 routing
map.resources :products, :collection => { :edit_individual => :post, :update_individual => :put }
to the rails 3 convention as described by engineyard http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/ (updated to my needs)
resources :orders do
collection do
post :edit_individual
put :update_individual
end
end
Here's what I've tried:
I've tried changing the routes resources as suggested by the answer to: Adding an action to an existing controller (Ruby on Rails) but the same error still shows. I've tried removing the cancan load and authorize resources, the 'resources :orders' route entry, as well as the 'show' entry in the controller, but another error indicates it's still trying to show a record with ID='edit_individual' instead of treating "edit_individual" like a route.
Here are my routes and controller,
myapp::Application.routes.draw do
resources :products
resources :roles
devise_for :users #, :controllers => { :registrations => "registrations" }
# match 'dashboard' => 'user_dashboard#index', :as => 'user_root'
resources :orders do
collection do
post :edit_individual
put :update_individual
end
end
resources :orders
class OrdersController < ApplicationController
load_and_authorize_resource # cancan method
def index
end
def show
end
def edit_individual #from railscast 198
@orders = current_user.customer_orders
end
def update_individual
@orders = Order.update(params[:orders].keys, params[:orders].values).reject { |p| p.errors.empty? }
if @orders.empty?
flash[:notice] = "Orders updated"
redirect_to orders_url
else
render :action => "edit_individual"
end
end # ...etc.
I've removed the cancan methods, but is it the culprit still? I've tried everything I can think of and am at a dead end.. any ideas?
edit:
the output from command prompt:
Started GET "/orders/edit_individual" for 127.0.0.1 at Thu Jun 30 11:19:02 -0700
2011
Processing by OrdersController#show as HTML
Parameters: {"id"=>"edit_individual"}
←[1m←[36mOrder Load (0.0ms)←[0m ←[1mSELECT "order开发者_如何转开发s".* FROM "orders" WHERE "or
ders"."id" = 0 LIMIT 1←[0m
Completed in 2584ms
ActiveRecord::RecordNotFound (Couldn't find Order with ID=edit_individual):
and the route in my html:
<%= link_to 'Update Payments Received', edit_individual_orders_path %>
and rake routes:
edit_individual_orders POST /orders/edit_individual(.:format) {:action=>"edit_individual", :controller=>"orders"}
update_individual_orders PUT /orders/update_individual(.:format) {:action=>"update_individual", :controller=>"orders"}
orders GET /orders(.:format) {:action=>"index", :controller=>"orders"}
POST /orders(.:format) {:action=>"create", :controller=>"orders"}
new_order GET /orders/new(.:format) {:action=>"new", :controller=>"orders"}
edit_order GET /orders/:id/edit(.:format) {:action=>"edit", :controller=>"orders"}
order GET /orders/:id(.:format) {:action=>"show", :controller=>"orders"}
PUT /orders/:id(.:format) {:action=>"update", :controller=>"orders"}
DELETE /orders/:id(.:format) {:action=>"destroy", :controller=>"orders"}
You should probably run "rake routes" and see what route it gives for "edit_individual" action.
Also your log
Started GET "/orders/edit_individual" for 127.0.0.1 at Thu Jun 30 11:19:02 -0700
says that you are calling a post action as get.
Try below
resources :orders do
collection do
get :edit_individual
put :update_individual
end
end
OR either way you can use
<%= link_to 'Update Payments Received', edit_individual_orders_path, :method => "post" %>
So the error message: OrdersController#show - Couldn't find Order with ID=edit_individual tells me that for whatever reason you're being routed to the 'show' action, which is inherently expecting something like
/orders/1
meaning it's a member not a collection. Are you certain that the url being hit in your server output matches /orders/edit_individual?
精彩评论