目前的项目有这样的需求,在用户的注册表单界面,需要用户输入手机验证码,然后才能注册成功。
怎样才能在不提交 form 的情况下,把 用户填写的手机号码获取到,然后传递到 Users#send_sms action 中呢?
在这个注册页面,可以通过 $("#phone_number").val()
获取到手机号,但是不知道怎么才能把这个值传递到 参数中,比如: params.merge(phone_number: phone_number)
class UsersController < ApplicationController
# 发送验证码短信到用户手机,需要提供手机号码
def send_sms
phone_number = ?
end
end
注册表单:
<%= form_for(:user, url: users_path) do |f| %>
<%= f.text_field :phone_number, placeholder: "手机号", autofocus: true, id: "phone_number" %>
<input type="text" placeholder="验证码"/>
<%= link_to send_sms_users_path, method: :get, id:"send_sms",remote: true do %>
<span id="send_sms">获取验证码</span>
<% end %>
<%= f.password_field :password, placeholder: "密码" %>
<%= f.submit "注册", class: "button" %>
<% end %>
#3 楼 @qinfanpeng 也想过,在 send_sms.js.erb 文件里能取到 phone_number
, 但是我该怎么传到 controler 的 send_sms
action 里面 ? 平时,只是用 Ajax 来 render html partial.
暂不清楚你send_sms.js.erb
这里是做啥用的,不过参考 jQuery 代码如下:
$.post 'send_sms_users_path',
data: { phone_number: $("#phone_number").val() }
@qinfanpeng @lb563 现在问题是怎么触发这个 POST 请求?
下面这个 获取验证码的链接,已经是 Ajax 请求了,路由是 send_sms_users_path, 对应的 view users/send_sms.js.erb
<%= link_to send_sms_users_path, method: :get, id:"send_sms",remote: true do %>
<span id="send_sms">获取验证码</span>
<% end %>
在 send_sms.js.erb 里面 这样写
$.post("/users/send_sms", data: { phone_number: $("#phone_number").val()});
然后 在 Users#send_sms 的 action 里面 还是没有获取到 prams[:phone_number]
参数是这样的:
[1] pry(#<UsersController>)> params
=> {"controller"=>"users", "action"=>"send_sms"}
$.post("/users/send_sms", { phone_number: $("#phone_number").val()});
顺便提一下,你的这个 post 还没有写返回的处理
手机号是 11 位。可以监听每次输入操作,keyup 或 keydown。判断输入框里面的值是否达到十一位,达到了就获取这个值然后 post 传到后台。你获取还没真正注册的人的手机号做什么作用呢?可能,这个手机号就是乱写的
没必要非要异步提交吧,你搞两个表单,一个输入手机号获取验证码,另一个通过验证码注册,相互不影响,这样不行吗?要让体验一些的话,获取验证码的表单使用 Ajax 来 render html partial,
#17 楼 @springwq 话说设计图会看到有几个表单?你样式统一的话看起来就是一个,两个表单的话,基本不怎么用 ajax 的知识啊,
<%= form_for(:user, url: sms_path) do |f| %>
<%= f.text_field :phone_number, placeholder: "手机号" %>
<%= f.submit "获取验证码", class: "button" %>
<% end %>
<%= form_for(:user, url: users_path) do |f| %>
<%= f.text_field :code, placeholder: "验证码" %>
<%= f.password_field :password, placeholder: "密码" %>
<%= f.submit "注册", class: "button" %>
<% end %>
#17 楼 @springwq @helperhaps 的方案也可以,不过有个问题是 form 不能嵌套,也就是说你的手机号字段要么放到最前面,要么放在最后面。