ruby-on-rails - 红宝石、阿贾克斯和主干
问题描述
我是红宝石和主干的新手,我正在尝试将数据发送到红宝石控制器,但我无法获得红宝石的参数。我忘记了什么?
在咖啡页面
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>
解决方案
如果没有您的所有代码,我不确定问题到底出在哪里。我认为最有可能的是你需要摆脱contentType: false
and 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 进程的控制台日志以及来自浏览器的控制台日志。
推荐阅读
- pandas - read_csv,在部分数据中使用分隔符
- firebase-analytics - 是否可以在没有 BigQuery 的情况下使用 api 从 Firebase 分析中获取原始事件?
- javascript - 如何删除以某个字符串开头的类?
- sql - 过滤器参数无法正常工作
- python - 如何在画布tkinter python中的鼠标点击图像上创建多边形
- javascript - 计时器触发 Azure 函数开始但未结束?
- delphi - 在 Delphi 中使用异常机制而不是“if”来处理默认对象参数
- java - 分页下载方法从服务器批量选择项目
- python - python flask SQLAlchemy将数据插入mysql
- .net-core - 将 DotNet Core 应用程序复制到 Service Fabric 中的图像存储需要很长时间