Переопределение рейлов
Для отправки формы требуется токен, названный принимающим сервером authenticity_token
и ожидает строку, которая известна только отправляющим и получающим серверам:
<input id="authenticity_token" name="authenticity_token" type="hidden" value="ac513de198a9f0536df5003fb5ba3122d1ee53d5" />
это значение отображается, если я вызываю экземпляр или глобальную переменную. Однако, хотя контроллер установлен со следующим фильтром:
skip_before_action :verify_authenticity_token, only: [:reservation]
пытаюсь ли я
<%= form_tag('https://test.webten.net/form') do %>
<%= hidden_field_tag :authenticity_token, @ppayment.authenticity_token, id: "authenticity_token" %>
или же
<%= tag(:input, type: "hidden", name: request_forgery_protection_token.to_s, value: @ppayment.authenticity_token) %>
или же
<input id="" name="authenticity_token" type="hidden" value="ac513de198a9f0536df5003fb5ba3122d1ee53d5" />
Rails заканчивает сжатие каждого значения своим собственным значением настройки сеанса и рендерингом:
<input type="hidden" name="authenticity_token" id="authenticity_token" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
<input type="hidden" name="authenticity_token" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
<input id="authenticity_token" name="authenticity_token" type="hidden" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
Как можно изменить поведение по умолчанию для rails в этом действии контроллера?
2 ответа
[ этот ответ дополняет предыдущий. Это решает проблему, но не элегантно ]
Различные возможные пути решения проблемы кажутся неполными
form_authenticity_token
является помощником вида, который возвращает токен аутентификации текущего сеанса Слишком поздно что-то предпринимать, поскольку макет может уже вызывать его- наиболее проголосовавший ответ имеет метод за действие
protect_from_forgery
за игнорирование его для внутренних целей. Все еще слишком поздно, поскольку сессия уже выпустила это - пропуск до действия аналогичен предыдущему решению, слишком поздно, выдан токен сеанса
- Направляющая рельсов неверна в заявлении:
authenticity_token: 'external_token'
Aaron Breckenridge
Ответ дает подсказку: "у вас, вероятно, есть какой-то JS, который перезаписывает маркер подлинности", поддерживаемый этой публикацией. Таким образом, можно искать содержимое каталога приложения и все еще не найти обработчик JS... когда, например, jquery-ujs установлен gem. Основываясь на наблюдаемом поведении, он должен быть запущен каждый раз, когда сталкивается name='authenticity-token'
и устанавливает значение на основе мета-тэга (логично. зачем иметь 2 разных токена на одной странице...) - все делает правильно!
Буквально этот токен не должен генерироваться выше по течению. Итак, изменив заголовок раздела макета:
<% unless request.path == "/controller/action" %>
<%= csrf_meta_tags %>
<% end %>
это рабочий раствор. Это решение подвержено загрязнению для нескольких путей. Другой требует многократной обработки макета... таким образом, файл в разделе 'kludgey'. (готов развлечь лучшего!)
Вы должны переопределить :authenticity_token
аргумент в form_tag
вызов, чтобы Rails не добавил токен аутентификации сеанса по умолчанию:
<%= form_tag('https://test.webten.net/form', authenticity_token: 'ac513de198a9f0536df5003fb5ba3122d1ee53d5') do %>
или же:
<%= form_tag('https://test.webten.net/form', authenticity_token: false) do %>
<%= hidden_field_tag 'authenticity_token', 'ac513de198a9f0536df5003fb5ba3122d1ee53d5' %>
Если это не сработает, возможно, у вас есть какой-то JS, который перезаписывает маркер подлинности, который вы указали в метке META. Ищите "csrf-token" в вашем JS.
См. http://guides.rubyonrails.org/form_helpers.html для получения дополнительной информации.