0

为了学习 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>
4

1 回答 1

0

好了,比这清楚多了。我最初的问题是我不了解 rails 如何处理表单,以及它是否可以接收有关未连接到数据库的字段的信息。

http://www.guides.rubyonrails.org/form_helpers.html帮了很多忙,这就是我的控制器现在的样子:

class FindNumbersController < ApplicationController

    def new
        @user = current_user
    end

    def create
        @user = current_user
        render 'find_numbers/show'
    end

    def show
        @user = current_user
        client = Twilio::REST::Client.new(@user.twilio_account_sid, @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

end

我仍然对 show 动作有疑问,但这超出了这个问题的范围。

于 2012-10-03T13:11:07.310 回答