Използвам backbone.js и работи чудесно. но формулярите, които създавам като javascript шаблон, нямат маркера за защита на rails csrf. Как да го добавя към шаблони, които създавам в javascript?
Rails - Как да добавя CSRF защита към формуляри, създадени в javascript?
Отговори (5)
Ако имате <%= csrf_meta_tag %>
във вашето оформление някъде и това е достъпно за вас от js, тогава можете да получите достъп до него с помощта на $('meta[name="csrf-token"]')
Вижте http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html за идея как да хакнете поддръжката на csrf във всяка заявка за гръбнак
$.ajax(data: {authenticity_token: $('meta[name="csrf-token"]').attr("content")})
- person Meekohi; 30.08.2018
Най-добрият начин, по който реших това, във формата:
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
Актуализация:
Изглежда, че form_authenticity_token
е частен за контролери в по-новите версии на релсите.
Ако вашият случай е такъв, това, което предлагам е: декларирайте променлива в контролер като: @form_token = form_authenticity_token
и я използвайте в изгледа, който търсите.
form_authenticity_token
частен в контролера?
- person Franklin Yu; 28.08.2016
undefined local variable or method 'form_authenticity_token' for #<#<Class:0x007ff80b1d36d8>:0x007ff7eec39b58>
- person juliangonzalez; 30.08.2016
form_authenticity_token
е частен за контролери, както каза Франклин. Това, което видях като предложение, беше да декларирам променлива в контролер @form_token = form_authenticity_token
и да я използвам в изгледа.
- person lucianosousa; 01.09.2016
Можете да добавите csrf токена към всеки формуляр, който използва „post“ или „delete“. Ето го в coffeescript:
$ ->
for f in $("form")
if f.method == 'post' or f.method == 'delete'
$(f).prepend("<input type='hidden' name='authenticity_token' value='" + token + "'>")
Уверете се, че имате ‹%= csrf_meta_tags %> във вашето оформление. Вече трябва да е в стандартното оформление на „приложение“, но го добавете, ако използвате различно оформление.
token
?
- person juliangonzalez; 29.08.2016
<%= csrf_meta_tags %>
, е, че този помощник на Rails генерира токен за вас и го вмъква в HTML head
. Токенът е атрибутът content
в тага <meta>
с име csrf-token
.
- person sameers; 28.07.2017
Имам формуляр във Vue компонент в приложение Rails 6.
За моя изненада беше достатъчно да се включи скрит вход с името authenticity_token
в шаблона Vue и при зареждане на страницата Rails попълни стойността с CSRF защитен токен.
E.g.
<template>
<div id="app">
<form
action="/submit"
method="post"
@submit.prevent="onSubmit"
>
<input
type="hidden"
name="authenticity_token"
value=""
>
<!-- rest of form -->
</form>
</div>
</template>
Което се изобразява като:
<div id="app">
<form action="/submit" method="post">
<input type="hidden" name="authenticity_token" value="zl9PJiE...">
...
</form>
</div>
Що се отнася до Rails 4.2.2, нямате право да използвате
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
от вашия файл с активи .js.erb
.
Можете обаче да създадете формуляра вътре във файла .js.erb
и в изгледа, съдържащ файла .html.erb
на формуляра, да използвате помощника hidden_field_tag
, за да генерирате маркерния елемент. Тъй като този елемент ще бъде генериран извън формуляра, можете да използвате jquery, за да добавите този елемент към формуляра.
Случай от проучване: SweetAlert (първата версия, версия също изглежда е решила този проблем)
show.js.erb
$('.js-button-apply-offer').click(function(e) {
var urlOffer = $(this).attr('data-url-offer');
var modalParams = {
type: 'warning',
title: 'add file',
text: '<p>Need to add a file before continuing</p>' // This is a hack for Sweet alert, solved in SweetAlert2 Consider upgrade
+"<form action='"+urlOffer+"' id='formCustomCV' method='post' enctype='multipart/form-data' data-remote='true'>"
+ "<input type='file' name='custom_cv' id='fileToUploadAlert' accept='application/pdf'>\n"
+"</form>",
html: true,
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: 'Send',
cancelButtonText: 'Cancel',
closeOnConfirm: false
}
swal(modalParams,
function(){
var form_token = $('#form_token');
$('#formCustomCV').append(form_token).submit(); //update to submit using ajax
});
show.html.erb
<%= button_tag t('offers.offer.apply'),
class: 'center-block btn btn-success js-button-apply-offer',
id: "js-button-apply-offer",
data: {
url_offer: apply_talents_offer_path(@offer),
}
%>
<%= hidden_field_tag :authenticity_token, form_authenticity_token, id: :form_token %>