Рубин, Аякс и Магистраль - PullRequest
0 голосов
/ 06 июля 2018

Я новичок в ruby ​​и магистрали и пытаюсь отправить данные на контроллер ruby, но не могу получить параметры для ruby. Я что-то забыл?

на официальном сайте

doLogin: ->
  username = $(@el).find('#username').val()
  password = $(@el).find('#password').val()

  params = {username: username, password: password}

  $.ajax
    type: 'POST'
    url: '/users/login'
    data: params
    cache: false
    contentType: false
    processData: false
    success: (response) =>
      if response.success
        debugger
        ......

на маршрутизаторе

match '/users/login' => 'user#login', via: :post

на UserController

def login
  username = params[:username]
  password = params[:password]

  @user = User.where({username: username, password: password}).first
  ......
end

на консоли Pry

[1] pry(#<UserController>)> params
=> <ActionController::Parameters {"controller"=>"user", "action"=>"login"} permitted: false>

1 Ответ

0 голосов
/ 06 июля 2018

Без всего вашего кода я не уверен, в чем именно проблема. Я думаю, что наиболее вероятно, что вам нужно избавиться от contentType: false и processData: false.

contentType: false означает, что вы не отправляете тип контента, и без этого Rails не знает, как анализировать параметры в теле POST. Вы, вероятно, хотите здесь использовать значение по умолчанию application/x-www-form-urlencoded, которое вы получите, если уберете эту опцию.

processData: false говорит jQuery не превращать ваш объект params в правильный формат для тела POST, и вы хотите, чтобы jQuery делал это, потому что вы хотите отправлять свои данные в формате application/x-www-form-urlencoded, который Rails будет анализировать и превращать в параметры.

Далее вам, вероятно, следует отправить токен CSRF с вашим запросом. Вы можете сделать это, добавив эти строки в ваш Coffeescript перед вызовом $.ajax:

token = $('meta[name="csrf-token"]').attr('content')
$.ajaxSetup
  beforeSend: (xhr) -> 
    xhr.setRequestHeader('X-CSRF-Token', token)

$.ajax
  type: 'POST'
  url: '/users/login'
  data: params
  cache: false
  success: (response) =>
    console.log(response)

Вы можете поместить этот вызов $.ajaxSetup в более централизованное место, потому что вы, вероятно, захотите его для каждого вызова AJAX вместо просто doLogin.

Если ни одна из этих проблем не является проблемой, вам следует отредактировать ваше сообщение, включив в него журнал консоли из процесса rails, а также журнал консоли из браузера.

...