NoMethodError:nil的未定义方法`each':NilClass

时间:2012-10-03 13:08:44

标签: ruby-on-rails

我正在尝试按照教程搜索和购买Twilio电话号码 - > http://www.twilio.com/docs/howto/search-and-buy

目前,我想要做的就是列出可用的电话号码。现在我有一个find_numbers控制器,带有new,create,destroy。

新动作具有用户填写的参数,并且创建动作呈现节目,并且节目应该将它们全部放在一起,并列出数字。

但是,使用我的代码,我收到错误

NoMethodError in Find_numbers#create

Showing C:/Sites/dct/app/views/find_numbers/show.html.erb where line #1 raised:

undefined method `each' for nil:NilClass

我认为这是因为我的@numbers变量返回nil,因为搜索参数设置不正确。

以下是我对新动作的看法:

<div class="container">
 <div class="row">
  <div class="span6 offset3">
    <%= form_tag("/find_numbers", :method => "post" ) do %>

      <%= label_tag(:in_postal_code, "Near US postal code (e.g. 94117):") %>
      <%= text_field_tag(:in_postal_code) %>

      <%= label_tag(:near_number, "Near this other number (e.g. +4156562345)") %>
      <%= text_field_tag(:near_number) %>

      <%= label_tag(:contains, "Matching this pattern (e.g. 415***EPIC):") %>
      <%= text_field_tag(:contains) %>  

      <%= submit_tag("Search", :class => "btn btn-large btn-primary") %>


    <% end %>
  </div>
 </div>
</div>

这是find_numbers控制器

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

这就是展示视图

  
<%= number.friendly_name %>
<%= number.phone_number %>
  

从今天上午(中国时间)开始,我越来越接近答案,但仍然在圈子里跑来跑去!非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可能想了解更多有关rails的信息。我以前开始的那本书是http://pragprog.com/book/rails4/agile-web-development-with-rails

您现在正在做的事情似乎违背了rails的设计方式,但您可以在创建操作中添加以下内容:

@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)
render 'find_numbers/show'

还要记住你有对象@numbers所以在你的节目视图中你必须做每个循环,如:

<% @numbers.each do |number| %>
  <%= number.friendly_name %>
  <%= number.phone_number %>
<% end %>

我对Twilio一无所知,所以我无法检查您对API的使用情况。