首页 > 解决方案 > 红宝石、阿贾克斯和主干

问题描述

我是红宝石和主干的新手,我正在尝试将数据发送到红宝石控制器,但我无法获得红宝石的参数。我忘记了什么?

在咖啡页面

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

在用户控制器 < 应用控制器

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>

标签: ruby-on-railsrubyajaxbackbone.jscoffeescript

解决方案


如果没有您的所有代码,我不确定问题到底出在哪里。我认为最有可能的是你需要摆脱contentType: falseand processData: false

contentType: false意味着您没有发送内容类型,并且没有该内容,Rails 不知道如何解析 POST 正文中的参数。您可能想要这里的默认值,application/x-www-form-urlencoded如果您删除该选项,您将获得该默认值。

processData: false告诉 jQuery 不要将您的 params 对象转换为适合 POST 正文的格式,并且您希望 jQuery 这样做,因为您希望以application/x-www-form-urlencodedRails 将解析并转换为参数的格式发送数据。

接下来是您可能应该将 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 进程的控制台日志以及来自浏览器的控制台日志。


推荐阅读