簡體   English   中英

發布后的Ruby on Rails路由錯誤

[英]Ruby on rails routing error after post

我嘗試從Ruby返回json時遇到問題。

這是我的控制器( parts_controller )。

    def show()
    @part = Part.find(params[:id])
    unless @part.nil?
        render json: @part
    end       
end

我的路由文件:

Rails.application.routes.draw do

  root to: "home#index"
  resources :parts


end

這是我從愛奧尼克(Ionic)獲得的帖子方法。

postData()
{

  let headers = new Headers();
  headers.append('Content-Type', 'application/json');

    let body = {
   id: 1
  };

    this.http.post('http://localhost:3000/parts/1', JSON.stringify(body), {headers: headers})
    .map(res => res.json())
    .subscribe(data =>{
        console.log(data);
   });          
}

如果我手動輸入http:// localhost / 3000 / parts / 1,它會返回JSON,但是當我試圖通過郵寄方式獲取它時,它會拋出: POST http:// localhost:3000 / parts / 1 404(Not找到)

我也有show和index方法的視圖,謝謝您的寶貴時間。

如何修復

this.http.get('http://localhost:3000/parts/1', {headers: headers})
    .map(res => res.json())
    .subscribe(data =>{
        console.log(data);
   }); 

為什么?

因為顯示應該具有GET not POST方法。 POST用於將數據發送(POST)到后端,而不是獲取數據。

如果您使用耙式路徑或鐵軌式路徑,則會找到正確的路徑,以及可以用於每個動作的方法。

我為所有http請求創建了一個父類,

api.service.ts

import {HttpClient, HttpParams} from '@angular/common/http';
import {Injectable} from '@angular/core';
import {ENV} from '@app/env';
import {Observable} from "rxjs/Observable";

@Injectable()
export class Api {
  constructor(public http: HttpClient) {}

  post(endpoint: string, body: any) {
    return this.http.post(ENV.SERVER_URL + '/' + endpoint, body);
  }
}

我寫了一個班級,在每次提出要求之前

http.token.interceptor.ts

export class TokenInterceptor implements HttpInterceptor {
  constructor(public auth: AuthService) {}
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    request = request.clone({
      setHeaders: {
        Accept: 'application/xxx.v1+json',
        Authorization: "bearer " + this.auth.getToken()
      }
    });
    return next.handle(request);
  }
}

因此添加的標頭以及每個請求都將到達服務器。

零件服務

...
constructor(public api: Api) {}

  getParts(): Observable<Part[]>{
    return this.api.get("parts")
      .map(res => {
        if(res) {
          return res.map(item => {
            return new Part(item);
          });
        }
      });
  }
...

我們現在就可以使用該服務進行訂閱了

任何服務或組件

this.partService.getParts().subscribe(parts => {
   ..
   });
},(error: Response) => {
  return Observable.throw(error)
});

您需要在服務器端進行機架式驗證

Gemfile.rb

gem 'rack-cors'

並且您必須添加到...

application.rb

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: %i[get post options patch delete]
      end
    end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM