2016-12-20 5 views
0

Итак, я работаю над api на основе местоположения с рельсами, где в местоположении есть много пользователей и пользователь принадлежит к определенному местоположению. Это означает, что таблица пользователя будет содержать столбец location_id, который служит в качестве внешнего ключа. Это, однако, отличается от большинства приложений, над которыми я работал, в которых у пользователя будет много «продуктов», например. Итак, у меня есть это в моем locations_controller.rb файлеЦепь фильтра остановлена ​​как: authenticate_with_token! визуализированный или перенаправленный Rails API

class Api::V1::LocationsController < ApplicationController 
    before_action :authenticate_with_token!, only: [:create] 
    respond_to :json 

    def show 
     respond_with Location.find(params[:id]) 
    end 

    def create 
     # @location = current_user.locations.build(location_params) 
     @location = Location.new(location_params) 
     current_user.location = @location 
     current_user.save 
     if @location.save 
      render json: @location, status: :created, location: [:api, :v1, @location] 
     else 
      render json: {errors: @location.errors}, status: :unprocessable_entity 
     end 
    end 

    private 


    def location_params 
     params.require(:location).permit(:latitude, :longitude, :address) 
    end 
end 

Но я получаю ошибку

Started POST "/api/v1/locations" for 127.0.0.1 at 2016-12-20 10:05:50 +0100 
Processing by Api::V1::LocationsController#create as JSON 
    Parameters: {"location"=>{"latitude"=>"2.23413", "longitude"=>"2.908019", "address"=>"Sims1 streets"}} 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" IS NULL LIMIT 1 
Filter chain halted as :authenticate_with_token! rendered or redirected 
Completed 401 Unauthorized in 5ms (Views: 0.2ms | ActiveRecord: 0.5ms) 

Мой вопрос: Как я могу решить эту проблему? Я искал всюду, но все безрезультатно. Пожалуйста, помогите

Мой файл authenticable.rb является

module Authenticable 

    # Devise methods overrides. This finds the user by auth_token and it's sent to the server 
    def current_user 
    @current_user ||= User.find_by(auth_token: request.headers["Authorization"]) 
    end 

    def authenticate_with_token! 
    render json: { errors: "Not authenticated" }, status: :unauthorized unless user_signed_in? 
    end 

    def user_signed_in? 
    current_user.present? 
    end 

end 
+0

Если 'request.headers [«Authorization»]' пуст или отсутствует, он будет регистрировать вас в качестве первого пользователя он обнаружил, что не имеет набора 'auth_token'. Убедитесь, что 'request.headers [" Authorization "]' не ноль! – mattes

ответ

0

Вы вызываете функцию обратного вызова befote по созданию действия

before_action :authenticate_with_token!, only: [:create] 

так всякий раз, когда вы будете идти к этому действию он будет просить о действительной аутентификации токен, действие не будет выполняться до тех пор, пока не будет предоставлен действительный токен аутентификации.

Как вы можете видеть в консоли

User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" IS NULL LIMIT 1 

Маркер польза является недействительным.

Пожалуйста, попробуйте отправить действительный authtoken для аутентификации пользователя перед действием craete.

У вас может быть столбец auth_token в таблице ваших пользователей. Попробуйте найти authentication_token для любого пользователя и передать его в URL

т.е.

/api/v1/locations?user_token= your token 
+0

Пожалуйста, @kajalOjha, как мне это сделать? Я занимался мозговым штурмом о том, как добиться этого. Пожалуйста, помогите мне. Спасибо – Dayvino

+0

@ Дайвино отредактировал мой ответ, надеюсь, это поможет –

+0

Большое спасибо. Я проверю это сейчас. Я действительно делал/api/v1/locations? Auth_token = ваш токен до сих пор – Dayvino