Domanda

sto usando Backbone.js per creare un puro JS front-end per i miei applicazione Rails utilizzando un API JSON.

I backbone.js modello sembra URL come questo:

window.MedicationCollection = Backbone.Collection.extend({
  model: Medication,
    url: 'http://localhost:3000/medication_options'
});

CRUD funziona bene con questo. E 'l'invio di richieste al mio server con una "/ JSON applicazione" tipo di contenuto.

Ma avevo bisogno di aggiungere l'autenticazione per l'API e il mio rotaie app utilizza Authlogic così ho aggiunto questo:

  before_filter :require_user

     def require_http_auth_user
        return true if current_user
        authenticate_or_request_with_http_basic do |email, password|
          email = email.gsub("_at_", "@") if email.include?("_at_")
          if @current_user = User.find_by_email(email)
            @current_user.valid_password?(password)
          else
            false
          end
        end
      end

E un metodo tipico CRUD in Rails si presenta così:

  def update
    @medication_option = MedicationOption.find(params[:id])
    if @medication_option.update_attributes(params[:medication_option])
      flash[:notice] = "Successfully updated medication."
    end
    respond_with @medication_option
  end

Quindi, nel mio modello Backbone.js ho aggiunto "username: password" per l'url:

window.MedicationCollection = Backbone.Collection.extend({
  model: Medication,
    url: 'http://username:password@localhost:3000/medication_options'
});

L'autenticazione funziona bene con le credenziali appropriate, ma per qualche motivo tutte le richieste Backbone.js vengono interpretati dal server Rails come HTML invece di JSON.

Per qualche ragione durante una base di autenticazione HTTP, l'intestazione JSON si perde nel mix.

Quindi, se posso aggiungere in modo esplicito ".json" al fine dell'URL in questo modo:

window.MedicationCollection = Backbone.Collection.extend({
  model: Medication,
    url: 'http://username:password@localhost:3000/medication_options.json'
});

posso ottenere le richieste GET di base per il lavoro.

Ma quando faccio CRUD che non funziona perché si aggiunge l'ID alla fine dell'URL, in modo che gli errori:

ActionController::RoutingError (No route matches "/medication_options.json/41516")

Quindi non sono sicuro dove andare da qui.

È stato utile?

Soluzione

Il .json dovrebbe sempre essere alla fine dell'URL per essere interpretato come JSON:

/medication_options/41516.json

È possibile modificare l'URL del modello così come l'URL della raccolta, se necessario, per mettere il JSON al posto giusto.

Il problema principale è il motivo per cui non viene elaborato come json in primo luogo. Se si utilizza rotaie 3 avete:

respond_to :js 

o

respond_to :json

per abbinare il vostro respond_with e assicurarsi che il regolatore accetta questo tipo di formato (altrimenti rotaie restituirebbe 406 errore per difetto)?

Altri suggerimenti

Non ho mai usato Document.js, ma nel guardare attraverso i documenti a quanto pare è possibile ignorare url e restituire il risultato di una funzione invece di dare un valore stringa letterale. Potrebbe aggiungere il .json alla fine della stringa URL che modo?

provare qualcosa di simile:

 _.extend(Medication, 
    {extension:'.json',
     url:function() {
          var base = getUrl(this.collection);
          if (this.isNew()) return base + this.extension;
          return (base + (base.charAt(base.length - 1) == '/' ? '' : '/')
                  + this.id + this.extension);
        }
    });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top