2015-11-15 3 views
0

Прошу прощения, если это кажется довольно сложным вопросом, но я тоже довольно новичок в этом, так что ... У меня проблемы с основными операциями в приложении, которое использует API (как на рельсах), , но скажем, что на данный момент все, что я хочу сделать, это создать запись в db API через запрос от приложения.POST для Rails API с использованием Rails и HTTParty

Так это то, что я сделал до сих пор:

  • Для API я использовал rails-api gem.
  • Для приложения, использующего API, я использовал HTTParty gem.

Для API я последовал за этот учебник railscasts.com: the rails api-gem, и я сделал City модель команды корыто rails g scaffold City name:string description:string.

В результате контроллер это:

class CitiesController < ApplicationController 
    before_action :set_city, only: [:show, :update, :destroy] 

    # GET /cities 
    # GET /cities.json 
    def index 
    @cities = City.all 

    render json: @cities 
    end 

    # GET /cities/1 
    # GET /cities/1.json 
    def show 
    render json: @city 
    end 

    # POST /cities 
    # POST /cities.json 
    def create 
    @city = City.new(city_params) 

    if @city.save 
     render json: @city, status: :created, location: @city 
    else 
     render json: @city.errors, status: :unprocessable_entity 
    end 
    end 

    # PATCH/PUT /cities/1 
    # PATCH/PUT /cities/1.json 
    def update 
    @city = City.find(params[:id]) 

    if @city.update(city_params) 
     head :no_content 
    else 
     render json: @city.errors, status: :unprocessable_entity 
    end 
    end 

    # DELETE /cities/1 
    # DELETE /cities/1.json 
    def destroy 
    @city.destroy 

    head :no_content 
    end 

    private 

    def set_city 
     @city = City.find(params[:id]) 
    end 

    def city_params 
     params.require(:city).permit(:name, :description) 
    end 
end 

Обратите внимание на маршруты города являются:

cities GET /cities(.:format)  cities#index 
     POST /cities(.:format)  cities#create 
    city GET /cities/:id(.:format) cities#show 
     PATCH /cities/:id(.:format) cities#update 
     PUT /cities/:id(.:format) cities#update 
     DELETE /cities/:id(.:format) cities#destroy 

Теперь, в приложение, которое будет потреблять API услуги, которые я сделал корыто города контроллера rails g controller cities index new show edit destroy и я поставил некоторый код, пытающийся создать запись через API, но это ничего не значит.

Код контроллера является:

class CitiesController < ApplicationController 
    before_filter :authenticate_user! 

    def index 
    end 

    def new 
    @result = HTTParty.post('url_of_my_api_on_heroku/cities', :body => {:name => 'New York', :description => 'ABC'}.to_json, :headers => { 'Content-Type' => 'application/json' }) 
    end 

    def show 
    end 

    def edit 
    end 

    def destroy 
    end 
end 

То, что я пытаюсь сделать, это создать запись City (где название «Нью-Йорк» и описание «ABC»), когда я иду к новому представлению моего приложения (я делаю это только для проверки), но когда я перехожу к окну new городов в моем приложении, API, развернутый на Heroku, всегда возвращает пустой хэш, где он возвращает хеш городов, поэтому я не знаю, есть ли у меня что-то неправильное в API, в приложении, которое использует API, или в обоих из них, кто-нибудь может сказать мне, как сделать эту работу ?.

ответ

1

В CitiesController, мы требуем: город в 'city_params'

def city_params 
    params.require(:city).permit(:name, :description) 
end 

Но при вызове API, мы пропустили прохождение: город

def new 
    @result = HTTParty.post('url_of_my_api_on_heroku/cities', :body => {:name => 'New York', :description => 'ABC'}.to_json, :headers => { 'Content-Type' => 'application/json' }) 
end 

Таким образом, это должно быть:

def new 
    @result = HTTParty.post('url_of_my_api_on_heroku/cities', :body => {:city => {:name => 'New York', :description => 'ABC'}}.to_json, :headers => { 'Content-Type' => 'application/json' }) 
end 
Смежные вопросы