2016-07-28 14 views
1

OrdersページにはAngularJSを使用するアプリケーションがあります。これは、JSON API経由でRailsのSQLite3/Postrgresデータベースに接続します。 AngularページからOrdersを作成して削除することはできますが、出荷された注文(チェックボックス)の更新には問題があります。チェックボックスをクリックすると、出荷された値がfalseからtrueに変更されたことが示されますが、エラー番号:POST ... /orders/1.json 404(Not Found)が返されます。AngularJS RailsのデータベースへのPOST更新

私はこの問題がRailsのorders_controllerのコードにあるかもしれないと思います。

ここに私のコードです。

index.html.erb

<input type="checkbox" value="order.shipped" ng-click="changeShipped(order)"> 

app.js

// change shipped status via checkbox 
$scope.changeShipped = function(order) { 
    order.shipped = !order.shipped; 
    models.orders.save(order); // returns POST... 404 (Not Found) 
    console.log(order.shipped); // indicates true/false 
} 

orders_controller.rb

class OrdersController < ApplicationController 
    protect_from_forgery 
    skip_before_action :verify_authenticity_token, if: :json_request? 
    respond_to :json, :html 
    load_and_authorize_resource 

def index 
    @user = current_user 
    @orders = Order.all.to_json(:include => [{:product => {:only => :title}}, {:user => {:only => :email}}]) 
    respond_with @orders 
end 

def show 
    @order = Order.find(params[:id]).to_json(:include => [{:product => {:only => :title}}, {:user => {:only => :email}}]) 

# def new 
# end 

def create 
    @order = Order.create(order_params) 
    respond_with @order 
end 

def update 
    @order = Order.find(params[:id]) 
    respond_with @order 
end 

def destroy 
    respond_with Order.destroy(params[:id]) 
end 

protected 

def json_request? 
    request.format.json? 
end 

private 
def order_params 
    params.require(:order).permit(:product_id, :user_id, :total, :shipped) 
    end 
end 

次モデル私が言うことができるものから、

t.integer "user_id" 
t.integer "product_id" 
t.decimal "total" 
t.boolean "shipped", default: false, null: false 
t.index ["product_id"], name: "index_orders_on_product_id" 
t.index ["user_id"], name: "index_orders_on_user_id" 

routes.rbを

Rails.application.routes.draw do 
    devise_for :users, :controllers => { :registrations => "user_registrations" } 
    resources :users 
    resources :orders, only: [:index, :show, :create, :update, :destroy] 

    resources :products do 
    resources :comments 
    end 

    root 'static_pages#index' 

    get '/search', to: 'static_pages#search' 

    get '/search_results', to: 'products#search_results' 

    get '/about', to: 'static_pages#about' 

    get '/contact', to: 'static_pages#contact' 

    post 'static_pages/thank_you' 

    devise_scope :user do 
    get '/sign_up', to: 'devise/registrations#new' 
    get '/profile', to: 'devise/registrations#edit' 
    end 

    post '/payments/create', to: 'payments#create' 
    get 'payments/payment_thank_you', to: 'payments#payment_thank_you' 
end 
+0

また、あなたのルートを投稿してもらえますか? – Finks

+0

確かに、上記を参照 – Christian

答えて

1

は、あなたがupdateアクションにPOSTリクエストを送っているが、デフォルトでは、レールが期待しているようですPUTまたはPATCHそのような要求への要求。

しかし、ほとんどのブラウザーでは、Ajaxを経由して、実際のHTTP PUTまたはPATCH要求をサポートしていませんので、トリックは、投稿JSONデータに_method特有の、追加することです。

{_method:'put', order: order_data } Ruby on rails - PUT method on update ajax

+0

そうかもしれない。私のJSはどうですか? '$ scope.changeShipped = function(order){' – Christian

+0

このコードはajaxリクエストを送信しているようだから、models.orders.save(order)をチェックする必要があります。 POSTの代わりにPUT要求を送信するように更新する必要があります。 – Finks

関連する問題