2

Nous venons de sécuriser notre application avec un certificat SSL. Le passage à HTTPS s'est avéré plus complexe que nous le pensions et nous sommes en train de trier quelques-uns des bugs qui en résultent.Rails 4 - MissingTemplate/Erreur partielle manquante, uniquement en production

Nous avons un appel AJAX dans CoffeeScript, où les rails répond en rendant le html d'un partiel. Cela fonctionne parfaitement dans le développement.

CoffeeScript:

coffee_method: (pos, uid) => 

    $.ajax '/contoller/test/', 
    type: 'POST' 
    data: 
     pos: pos 
     uid: uid 
    success: (data) -> 
     $('#result-div').html(data) #Populates side menu with _next_destination_menu content 
    error: -> 
     alert 'How embarassing! Something went wrong - please try your search again. ' 

Controller:

def test 
    ... #do some stuff 

    puts "format requested: #{request.format}" 
    puts "format url_encodeded: #{request.format.url_encoded_form?}" 

    render partial: 'trips/_test' #app/views/trips/_test.html.erb 

end 

Cependant, dans la production, nous obtenons l'erreur suivante: ActionView::MissingTemplate (Missing partial trips/_test with {:locale=>[:en], :formats=>[:url_encoded_form], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}.

Après quelques recherches, je me suis dit à la demande dans la production était un format différent. En utilisant ces lignes puts dans le contrôleur de débogage, voici les résultats:

Production:

format requested: application/x-www-form-urlencoded 
format url_encodeded: true 

Développement:

format requested: */* 
format url_encodeded: false 

Quelle est la meilleure façon de traiter cette question. Est-ce que je:

  • Modifier le type de contenu de chaque appel AJAX dans le CoffeeScript?
  • Ajouter un respond_to...format.url_encoded_form {render partial: trips/test} au contrôleur?

Ce dernier semble que je serais la duplication de code, parce que je veux rendre la même partielle, quel que soit le format de la demande entre en jeu. J'ai essayé format.all {...} mais a rencontré le même problème. Toutes les meilleures pratiques sont appréciées!

Mise à jour:

Spécification de la réponse de type me donne directement la même erreur de modèle manquant:

respond_to do |format| 
    format.html {render partial: 'trips/test'} 
    format.json {render partial: 'trips/test' } 
    format.url_encoded_form {render partial: 'trips/test'} 
end 

Mise à jour 2:

Les têtes de requête pour les deux localhost et la production sont De même, le type de contenu est application/x-www-form-urlencoded, même si format.url_encoded_form? renvoie la valeur false.

Accept:*/* 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4 
Connection:keep-alive 
Content-Length:37 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
+0

Utilisez-vous un proxy (comme nginx?) Qui pourrait être modifier la demande? –

+0

@NickTomlin - Je ne crois pas que nous utilisions un proxy, mais nous utilisons AWS CloudFront pour une distribution Web. – CHawk

Répondre

2

Vous pouvez essayer passer dans le format, le lieu et les gestionnaires exactement comme demandé:

render(
       partial: 'trips/test', 
     formats: [:html, :js, :json, :url_encoded_form], 
     locale: [:en], 
     handlers: [:erb, :builder, :raw, :ruby, :coffee, :jbuilder])