Редактировать несколько записей, контроллер и маршрутизацию - PullRequest
1 голос
/ 30 июня 2011

Я слежу за Railscast 198 http://railscasts.com/episodes/198-edit-multiple-individually,, пытаясь обновить его до rails 3, и застрял с ошибкой маршрутизации. Маршрут http://localhost:3000/orders/edit_individual дает мне ошибку:

ActiveRecord::RecordNotFound in OrdersController#show - Couldn't find Order with ID=edit_individual

я обновил и использовал его рельсы 2 маршрутизации

map.resources :products, :collection => { :edit_individual => :post, :update_individual => :put }

к соглашению о рельсах 3, как описано в Engineyard http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/ (обновлено в соответствии с моими потребностями)

  resources :orders do
    collection do
      post :edit_individual
      put :update_individual
    end
  end

Вот что я пробовал:

Я попытался изменить ресурсы маршрутов, как было предложено в ответе: Добавление действия к существующему контроллеру (Ruby on Rails) , но та же ошибка все еще отображается. Я попытался удалить канкан загрузку и авторизацию ресурсов, запись маршрута 'resources: orders', а также запись 'show' в контроллере, но другая ошибка указывает, что он все еще пытается показать запись с ID = 'edit_individual' вместо обработки "edit_individual", как маршрут.

Вот мои маршруты и контроллер,

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.

Я удалил канканские методы, но все-таки это преступник? Я перепробовал все, что мог придумать, и зашел в тупик ... есть идеи?

редактирование:

вывод из командной строки:

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 "orders".* FROM "orders" WHERE "or
ders"."id" = 0 LIMIT 1←[0m
Completed   in 2584ms

ActiveRecord::RecordNotFound (Couldn't find Order with ID=edit_individual):

и маршрут в моем html:

    <%= link_to 'Update Payments Received', edit_individual_orders_path %>

и рейк-маршруты:

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"}

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Вам, вероятно, следует запустить "rake route" и посмотреть, какой маршрут он дает для действия "edit_individual".

Также ваш журнал

Started GET "/orders/edit_individual" for 127.0.0.1 at Thu Jun 30 11:19:02 -0700

говорит, что вы вызываете действие post как get.

Попробуйте ниже

  resources :orders do
    collection do
      get :edit_individual
      put :update_individual
    end
  end

ИЛИ в любом случае вы можете использовать

<%= link_to 'Update Payments Received', edit_individual_orders_path, :method => "post" %>
0 голосов
/ 30 июня 2011

Итак, сообщение об ошибке: OrdersController # show - Не удалось найти Order с идентификатором = edit_individual говорит мне, что по какой-то причине вы перенаправлены на действие «show», которое по своей природе ожидает что-то вроде

/orders/1

означает, что это член, а не коллекция.Вы уверены, что URL-адрес в выходных данных вашего сервера соответствует / orders / edit_individual?

...