Как я могу принять (и проанализировать) данные в кодировке www-url в приложении Ruby on Rails?

1

Я отправляю из приложения JS:

let config = {
  method: 'POST',
  headers: { 'Content-Type':'application/x-www-form-urlencoded' },
  body: 'email=${creds.email}&password=${creds.password}'
}
fetch('http://localhost:3000/sessions', config)

В моем контроллере Rails:

 class SessionsController < ApplicationController
  def create
    @user = User.where(email: params[:email]) # this doesn't work!
  end
end

Я получаю 400 плохих запросов с:

Started POST "/sessions" for 127.0.0.1 at 2017-08-25 23:56:56 +0200
Error occurred while parsing request parameters.
Contents:

email=hello&password=moto

ActionDispatch::Http::Parameters::ParseError
(743: unexpected token at 'email=hello&password=moto'):

Кто-нибудь мог пролить свет на то, как обрабатывать эти данные у JS?

  • 0
    Трудно сказать, что может происходить, потому что код JS в вопросе не похож на тот код JS, который вызывает проблему, показанную в сообщении журнала в вопросе. Сообщение журнала показывает журнал для POST для маршрута /sessions , но ваш код JS показывает POST для /sessions/create . Также в сообщении журнала указывается, что он получает email=hello&password=moto , но ваш JS-код предназначен для POST, который отправляет параметры в виде username=hello&password=moto .
  • 0
    Учитывая, что код JS, показанный в вопросе, не соответствует деталям отображаемого сообщения журнала на стороне сервера, вероятно, вы хотите использовать stackoverflow.com/posts/45890012/edit для редактирования / обновления вашего вопроса и публикации фактического точного кода JS вы проверяете запрос и фактическое сообщение журнала, которое вы получаете на стороне сервера, когда сервер получает этот запрос.
Показать ещё 1 комментарий
Теги:
redux
form-data

2 ответа

0

Да, вы можете указать конкретные действия для защиты csrf. → DOC

class ApplicationController < ActionController::Base
  protect_from_forgery
end

class SessionsController < ApplicationController
  protect_from_forgery except: :create

  def create
    render plain: params
  end
end
0

Я полагаю, вы должны добавить токен CSRF, чтобы обойти защиту подделок и добавить это ключевое значение в свои заголовки:

'X-CSRF-Token': document.querySelector("meta[name=csrf-token]").content

в противном случае вы могли бы использовать встроенную библиотеку rails-ujs, в которую уже включен этот токен:

Rails.ajax({
  type: "POST", 
  url: "http://localhost:3000/sessions/create",
  data: mydata,
  success: function(repsonse){...},
  error: function(repsonse){...}
})
  • 0
    Спасибо! Что именно должен содержать метатег csrf-token ? Мой интерфейс полностью отсоединен, так что, похоже, мне придется поместить его в мой HTML вручную.
  • 0
    csrf-токен генерируется Rails по запросу, а затем Rails сравнивает все не-GET-запросы Ajax с ним. Вы можете полностью отключить защиту от подделки в контроллере, но я думаю, что это не очень хорошая идея. Может быть, вы можете передать <%= csrf_meta_tags %> интерфейсу и затем использовать его в своих запросах Ajax? Вот документация, откуда я ее получаю: http://guides.rubyonrails.org/security.html#csrf-countermeasures
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню