2015-05-19 6 views
7

Ich bin ein POST https://heroku_client_path.herokuapp.com/login 405 (Not Allowed) für eine Ember.js App mit einem Rails-api bekommen (sowohl auf Heroku)Ember POST 405 (nicht erlaubt) w/Rails API

Wenn ein Login-Verarbeitung oder registrieren Sie sich. Ich denke, die Request-URL sollte der Heroku-Serverpfad/Login sein, da ich meine ADAPTER_URL heroku config var und nicht die oben angezeigte heroku-Client-URL einstelle.

Ich glaube, ich habe CORS Setup richtig eingerichtet.

Ich benutze Ember-CLI. Ich rolle die Auth, es ist nicht Simple-Auth.

environment.js:

module.exports = function(environment) { 
    var ENV = { 
    modulePrefix: 'client-rantly', 
    environment: environment, 
    baseURL: '/', 
    adapterURL: process.env.ADAPTER_URL, 
    locationType: 'auto', 
    EmberENV: { 
     FEATURES: { 
     } 
    }, 
    }; 

    if (environment === 'development') { 
    } 

    if (environment === 'production') { 
    } 

    return ENV; 
}; 

Adapter/application.js:

import DS from 'ember-data'; 
import ENV from '../config/environment'; 

export default DS.ActiveModelAdapter.extend({ 
    host: ENV.adapterURL || ENV.ADAPTER_URL, 
    headers: function() { 
    return { 
     'auth_token': localStorage.getItem('authToken') 
    }; 
    }.property('authToken') 
}); 

brocfile.js

var EmberApp = require('ember-cli/lib/broccoli/ember-app'); 

var app = new EmberApp({ 
    dotEnv: { 
    clientAllowedKeys: ['ADAPTER_URL'] 
    } 
}); 
module.exports = app.toTree(); 

Controller/application.js

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    needs: ['search'], 
    isAuthenticated: false, 

    init: function() { 
    var authToken = localStorage.getItem('authToken'); 
    if(authToken) { 
     this.isAuthenticated = true; 
    } 
    }, 

    actions: { 

    login: function() { 
     var credentials = { 
     email: this.get('email'), 
     password: this.get('password') 
     }; 

     this.set('errorMessage', null); 
     return Ember.$.post('login', credentials).then(function(response){ 
     this.set('errorMessage', response.error); 
     if (response.auth_token) { 
      localStorage.setItem('authToken', response.auth_token); 
      localStorage.setItem('userId', response.user_id); 
      this.set('isAuthenticated', true); 
      location.reload(); 
     } 
     }.bind(this)); 
    }, 
    } 
}); 

cors Schienen Seite - config/application.rb

require File.expand_path('../boot', __FILE__) 
require 'rails/all' 

Bundler.require(*Rails.groups) 

module ServerRantly 
    class Application < Rails::Application 
    config.active_record.raise_in_transactional_callbacks = true 
    config.autoload_paths << Rails.root.join('lib') 

    config.middleware.insert_before 0, "Rack::Cors", :debug => true, :logger => (-> { Rails.logger }) do 
     allow do 
     origins '*' 

     resource '/cors', 
      :headers => :any, 
      :methods => [:post], 
      :credentials => true, 
      :max_age => 0 

     resource '*', 
      :headers => :any, 
      :methods => [:get, :post, :delete, :put, :options, :head], 
      :max_age => 0 
     end 
    end 
    end 
end 
+0

Das sieht wie ein Schienenproblem aus. Hast du das Backend mit Postboten oder Curl getestet? Ist die Route vorhanden? Versuchen Sie, HTML anzufordern, wenn es json sein sollte? – user2105103

+0

@ user2105103 Ich habe mit Postboten getestet und es verarbeitet die POST-Anfrage ganz gut. Es gibt die richtige JSON-Antwort zurück. Obwohl mit der Rails-Server-URL, die nicht gesendet wird. Sogar versucht, die volle URL anstelle von "Login" für diese Aktion im Controller ohne Glück zu kodieren. – Jadam

+0

Können Sie versuchen, [this] (https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi) Erweiterung für Chrome zu verwenden, um CORS-Untersuchung zu vermeiden? –

Antwort

1

Auf dieser Linie:

adapterURL: process.env.ADAPTER_URL 

Wo ist process.env.ADAPTER_URL definiert?

Es scheint, als ob Sie auf dem richtigen Weg sind, indem Sie host auf dem ActiveModelAdapter Adapter überschreiben, um Ihre Nicht-Client-URL zu verwenden.

+0

Lokal zeigt es auf localhost, obwohl ich auf Heroku habe ich es auf meinem Rails-Server auch auf Heroku gehostet, weshalb ich es merkwürdig finde, dass selbst wenn es darauf zeigt, es immer noch den POST gegen die Ember-Client-URL läuft. – Jadam

Verwandte Themen