发布后的Ruby on Rails路由错误

时间:2018-07-19 21:54:33

标签: ruby-on-rails json ionic3

我在尝试从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(未找到)

我也有show和index方法的视图,谢谢您的时间。

2 个答案:

答案 0 :(得分:4)

如何修复

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

为什么?

因为该节目应该具有GET not POST方法。 POST用于将数据发送(POST)到后端,而不是获取数据。

如果您使用耙式路径或铁轨式路径,则会找到正确的路径,以及可以用于每个动作的方法。

答案 1 :(得分:0)

我为我的所有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);
  }
}

因此添加的标头以及每个请求都将到达服务器。

  

part.service.ts

...
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