2016-03-15 12 views
6

Sul mio rotaie app, su tutte le pagine, nella sezione di testa ci sono questi 2 meta tag:Rails 4. Come aggiungere authenticity_token ai moduli resi tramite partial?

<meta name="csrf-param" content="authenticity_token" /> 
<meta name="csrf-token" content="027GUZBeEkmv..." /> 

sulle forme non fusi con un parziale c'è una nascosta authenticity_token campo

<input type="hidden" name="authenticity_token" value="D5TddQruJppDD3..." /> 

Ma questo campo manca se si carica semplicemente il modulo in questo modo:

<%= render 'shared/comment_form' %> 

È questo comportamento previsto? Devo aggiungere manualmente un authenticity_token e in caso affermativo come convalidarlo?

Edit:

condiviso/_comment_form.html.erb

<%= form_for([@post, @comment], :html => { :onsubmit => "validateCommentForm(event)" }, remote:true) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
     <%= f.text_area :content, placeholder: "Add to the article. Make it be more" %> 
    </div> 

    <%= f.submit "Save", class: "btn btn-info" %> 
<% end %> 

Inoltre, aggiungendo <input type="hidden" name="authenticity_token" id="authenticity_token" value="ANYTHING" /> a quella forma riesce ancora a inviare informazioni e creare un nuovo record ...

+0

È possibile inviare i locali con un parziale di quando viene chiamato come tale: <% = render'shared/comment_form,: i locali => {: gettone => 'kasdlfjasldfj'}% – bkunzi01

+0

del 'costruttore form_for' o' form_tag 'di solito si occupa di aggiungere un campo nascosto con un token di autenticità, puoi mostrarci la forma di' shared/comment_form'? – sled

risposta

25

Nel tuo caso, abbiamo due modi per farlo:

  1. Aggiungi authenticity_token: true in Opzioni modulo

  2. aggiungere manualmente campo authenticity_token in forma, come questo :

<%= hidden_field_tag :authenticity_token, form_authenticity_token -%>

+0

Sì, questa è la soluzione, ma anche la spiegazione di ciò che sta accadendo è necessaria per capire perché questo sta accadendo e l'ho aggiunto in una risposta qui sotto – Catalin

2

Ok, quindi sembra che si tratti di moduli remoti e non di moduli caricati tramite un parziale:

Valore predefinito modificato per config.action_view.embed_authenticity_token_in_remote_forms su false. Questa modifica interrompe i moduli remoti che devono funzionare anche senza JavaScript, quindi se hai bisogno di un simile comportamento, puoi impostarlo su true o passare esplicitamente autenticità_token: true nelle opzioni del modulo.

risposta Trovato qui: https://github.com/rails/rails/issues/10608

Problemi correlati