[英]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.