[英]Rails Merge Form Fields
我有一个Rails 3.2.18应用程序,其中正在对模型执行简单的创建/更新操作。
有一个名为sms的字段,我使用ActionMailer将该消息以2812222222@vtext.com的形式发送到某人的电话。 目前,我可以手动键入此命令,但可以,但是我希望其他人能够输入电话号码,选择运营商,然后在sms字段中将这两项合并为正确的格式,再次为2812222222@vtext.com。 使其比必须完全知道完整的短信至电子邮件地址更加友好。
我想我可以通过JS / JQuery来完成大部分工作,但是我不确定如何开始。
我希望他们能够以281-555-4444格式输入电话号码,并选择运营商作为Tmobile,Verizon等的下拉菜单,并替换为@ tmomail.net,@ vtext.com等,剥离(正则表达式)电话号码,然后将其与运营商(@ vtext.com)合并到sms字段中。
如果有人能指出我正确的方向,将不胜感激。
更新:
我想可以使用辅助方法来定义载体:
def phone_carriers
{
"All Tell" => "@message.alltel.com",
"AT&T" => "@txt.att.net",
"Boost" => "@myboostmobile.com",
"Cellular South" => "@csouth1.com",
"Centennial Wireless" => "@cwemail.com",
"Cincinnati Bell" => "@gocbw.com",
"Cricket Wireless" => "@sms.mycricket.com",
"Metro PCS" => "@mymetropcs.com",
"Powertel" => "@ptel.net",
"Qwest" => "@qwestmp.com",
"Rogers" => "@pcs.rogers.com",
"Sprint" => "@messaging.sprintpcs.com",
"Suncom" => "@tms.suncom.com",
"T-Mobile" => "@tmomail.net",
"Telus" => "@msg.telus.com",
"U.S. Cellular" => "@email.uscc.net",
"Verizon" => "@vtext.com",
"Virgin Mobile USA" => "@vmobl.com"
}
结束
将attr_accessor:carrier添加到Person模型
然后在表单中执行以下操作:
<%= f.input :phone, placeholder: "555-555-5555", required: true, input_html: {required: true} %>
<%= f.select :carrier, phone_carriers.map{ |k, v| [k, v] }, {include_blank: true}, {placeholder: "Select your phone carrier", class: "select2"} %>
但是我仍然无法解决如何将电话号码剥离到5555555555以及将:phone字段与:carrier对象自动合并到:sms字段中的问题(最好是客户端)
经过大量研究和突破后,我提出了以下解决方案。 模型和表单仅显示我所做的更改,而不显示完整的表单或模型。
形成
<%= f.label 'Cell_Phone'%>
<%= f.text_field :phone, placeholder: "xxx-xxx-xxxx", required: true %>
<%= f.label :carrier, "SMS Notifications", class: "control-label" %>
<%= f.select :carrier, phone_carriers.map{ |k, v| [k, v] }, {include_blank: true}, {placeholder: "Select your phone carrier", class: "select2"} %>
<%= f.hidden_field :sms %>
模型
attr_accessible :carrier
attr_accessor :carrier
CoffeeScript的
$ ->
$("#person_carrier").on "change", update_sms_address
$("#person_phone").on "keyup", update_sms_address
update_sms_address
update_sms_address = ->
digits = $("#person_phone").val().match(/\d+/g)
phone = digits.join("") if digits
carrier = $("#person_carrier").val()
if phone? && phone.length == 10 && carrier
sms = phone + carrier
$("#person_sms").val(sms)
$("#person-sms-number").html(sms)
else if !carrier
$("#person_sms").val("")
$("#person-sms-number").html("Choose a carrier to receive SMS notifications")
else
$("#person_sms").val("")
$("#person-sms-number").html("Invalid phone number")
输入格式为281-444-4444的电话号码时,此方法似乎有效,因为它会精简该编号并将其与运营商数组中的值连接在一起,并适当设置隐藏的:sms字段。
我现在遇到的唯一问题是,因为我为载体使用了虚拟属性,如果我再次编辑该人,它不会保留载体选择并将其留空。 如果我提交表单时不更改任何信息,它将保留:sms字段,但是可能会造成混淆,因为:carrier不是数据库会记住的实际字段,而是虚拟属性。
有没有更好的方法可以做到这一点?
如果您使用标准的javascript字符串库,则不会像
function prepare(str){
str2 = str.replace("(","").replace(")","").replace("-","")
carrier = getCarrier //assuming this implemented by you somewhere
return (st2.concat(carrier))
}
我将从创建一个载体表开始:
rails generate model Carrier name:string email_domain:string
并通过在迁移中添加以下内容来在Person模型中引用它:
change_table :people do |t|
t.references :carrier
end
add_index :people, :carrier_id
以下是您的“人物”模型:
belongs_to :carrier
validates_presence_of :carrier
def sms
carrier ? "#{phone}@#{carrier.email_domain}"
end
def phone_with_dashes
"#{phone[0..2]}-#{phone[3..5]}-#{phone[6..9]}"
end
def phone_with_dashes=(_phone_with_dashes)
self.phone = _phone_with_dashes.gsub(/-/ ,'')
end
现在,您的视图(我将格式留给您):
Phone: <%= f.phone_field :phone_with_dashes %>
Carrier: <%= f.collection_select :carrier_id, Carrier.all, :id, :name %>
<div id='person-sms-number'>
<%= f.object.sms %>
</div>
最后,Coffeescript:唯一需要更改的地方是您不再需要'#person_sms'输入,因为您不再直接保留该值-您是从其他字段动态生成它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.