为了学习 Rails,我正在尝试构建一个应用程序,用户可以在其中通过 Twilio 购买电话号码。最初,我开始使用 2 个模型来完成此任务;用户 has_many 电话号码,并且 phone_numbers 属于用户。我想我已经处理了这部分,但我感到困惑的是如何实现
(1) 搜索电话号码 (2) 选择该号码后,将其填充到表单中以将其与其他信息一起推送到数据库。
我正在查看此文档以试图弄清楚 - http://www.twilio.com/docs/howto/search-and-buy
但是,它是用 Sinatra 编写的,一个轻量级的 ruby 框架,我最有经验的是完成 Michael Hartl 的 Rails 书。控制器和视图的啮合真的让我很困惑。
看着它,我想我需要创建一个新的控制器,比如 find_numbers,它有一个新的、创建和显示操作。创建操作将呈现 phone_numbers 控制器的新操作,然后将其发布到数据库。
但是,这是棘手的事情。我不知道如何将不在数据库中的信息字段移动到不同的视图。
例如,假设我在 find_numbers 视图中有这个
<form method="POST">
<label>near US postal code (e.g. 94117): </label><input type="text" size="4" name="in_postal_code"/><br/>
<label>near this other number (e.g. +4156562345): </label><input type="text" size="7" name="near_number"/><br/>
<label>matching this pattern (e.g. 415***EPIC): </label><input type="text" size="7" name="contains"/><br/>
<input type="submit" value="SEARCH"/>
</form>
因为这些不是数据库值,我将如何告诉创建操作使用这些作为参数来列出数字?这是他们在 Sinatra 中为创建操作所写的内容
post '/search-numbers' do
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'
client = Twilio::REST::Client.new(account_sid, auth_token)
search_params = {}
%w[in_postal_code near_number contains].each do |p|
search_params[p] = params[p] unless params[p].nil? || params[p].empty?
end
begin
local_numbers = client.account.available_phone_numbers.get('US').local
numbers = local_numbers.list(search_params)
unless numbers.empty?
out = '<html><head><title>Choose a number</title></head><body><h3>Choose a number</h3>'
numbers.each do |number|
out << "<form method='POST' action='/buy-number'>"
out << "<label>#{number.friendly_name}</label>"
out << "<input type='hidden' name='PhoneNumber' value='#{number.phone_number}' />"
out << "<input type='submit' value='BUY' /></form>"
end
out << '</body></html>'
else
'<b>Sorry!</b> Twilio doesn\'t have any numbers available that match those constraints.'
end
rescue StandardError => e
'<b>Sorry!</b> ' + e.message + '.'
end
end
有人可以帮我解构这段代码吗?比如,创建视图中会出现什么,创建动作中会出现什么?我的新观点还好吗?
之后,我想告诉 phone_number 控制器的新操作是哪个电话号码的方法是将其添加到 url,例如 /phone_number=123123123,这将填充该字段,我可以让 Twilio 从那里购买. 但是……上面的部分真的让我很困惑……
你将如何实现这一点?
我的尝试是这样的——
对于创建动作
def create
@user = current_user
client = Twilio::REST::Client.new(current_user.twilio_account_sid, current_user.twilio_auth_token)
search_params = {}
%w[in_postal_code near_number contains].each do |p|
search_params[p] = params[p] unless params[p].nil? || params[p].empty?
end
local_numbers = client.account.available_phone_numbers.get('US').local
@numbers = local_numbers.list(search_params)
end
对于创建视图
<%= numbers.each do |number| %>
<form method='POST' action='/buy-number'>
<label><%=number.friendly_name %></label>
<input type='hidden' name='PhoneNumber' value='#{number.phone_number}' />
<input type='submit' value='BUY' /></form>
<% end %>
但我得到了错误
undefined local variable or method `numbers' for #<#<Class:0x597cc48>:0x5979570>