2016-03-15 41 views
6

Na moim szynach aplikacji na wszystkich stronach, w sekcji head są te 2 meta tagi:Szyny 4. Jak dodać atrybut authenticity_token do formularzy renderowanych przez częściowe?

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

na formularzach niewytapiane użyciu częściowy jest ukryty authenticity_token pole

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

Ale to pole strzela gdybym po prostu załadować formę takiego:

<%= render 'shared/comment_form' %> 

czy to oczekiwane zachowanie? Czy należy ręcznie dodać authenticity_token, a jeśli tak, w jaki sposób sprawdzić poprawność?

Edit:

dzielony/_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 %> 

również dodanie <input type="hidden" name="authenticity_token" id="authenticity_token" value="ANYTHING" /> do tej formie nadal udaje się opublikować informacji i utworzyć nowy rekord ...

+0

można wysyłać mieszkańców z częściowym kiedy nazywa się takie: <% = render'shared/comment_form,: miejscowi => {: znacznik => 'kasdlfjasldfj'}% – bkunzi01

+0

Opcja 'form_for' budowniczy lub' form_tag 'zwykle dba o dodanie ukrytego pola z tokenem autentyczności, czy możesz pokazać nam formę' shared/comment_form'? – sled

Odpowiedz

25

W Twoim przypadku mamy dwa sposoby do zrobienia:

  1. Dodaj authenticity_token: true w opcji formularza

  2. ręcznie dodać pole authenticity_token w formie, jak to :

<%= hidden_field_tag :authenticity_token, form_authenticity_token -%>

+0

Tak, to jest rozwiązanie, ale również wyjaśnienie tego, co się dzieje, jest konieczne, aby zrozumieć, dlaczego tak się dzieje i dodałem, że w odpowiedzi poniżej – Catalin

2

OK, więc wygląda na to, że chodzi o formularze zdalne, a nie formularze załadowane za pomocą części:

Zmieniono wartość domyślną dla config.action_view.embed_authenticity_token_in_remote_forms na false. Ta zmiana powoduje zerwanie formularzy zdalnych, które muszą działać również bez JavaScriptu, więc jeśli potrzebujesz takiego zachowania, możesz ustawić je na true lub jawnie przekazać authenticity_token: true w opcjach formularza.

Znaleziono odpowiedź tutaj: https://github.com/rails/rails/issues/10608