0

Railsを学ぶために、ユーザーがTwilioを介して電話番号を購入できるアプリを作成しようとしています。最初は、これを実現するために2つのモデルから始めました。ユーザーhas_manyの電話番号、およびphone_numbersはユーザーに属します。私はこの部分を処理したと思いますが、私が混乱しているのは、

(1)電話番号の検索(2)その番号を選択したら、それをフォームに入力して、他の情報と一緒にデータベースにプッシュします。

私はそれを理解しようとこのドキュメントを見ています-http ://www.twilio.com/docs/howto/search-and-buy

しかし、それは軽いルビーのフレームワークであるシナトラで書かれており、私が経験したほとんどの経験は、マイケル・ハートルのRailsに関する本を完成させることです。コントローラとビューのメッシュは本当に混乱しています。

それを見て、新しいコントローラー、たとえばfind_numbersを作成する必要があると思いました。これには、new、create、およびshowアクションがあります。createアクションは、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>

これらはデータベース値ではないため、これらをパラメーターとして使用して数値を一覧表示するように、作成アクションをどのように指示しますか?作成アクションのために、彼らがシナトラで書いたものは次のとおりです

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コントローラーの新しいアクションにどの電話番号を使用するかを伝える方法は、/ phone_number = 123123123のようにURLに追加することであると思います。これにより、フィールドにデータが入力され、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

さて、これよりもはるかに明確になりました。私の最初の問題は、レールがフォームをどのように処理するか、データベースに接続されていないフィールドに関する情報をレールが受信できるかどうかを理解していなかったことです。

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

ショーアクションにはまだ問題がありますが、この質問の範囲外です。

于 2012-10-03T13:11:07.310 に答える