0

ローカルでエラーは発生していませんが、Herokuを使用しています。エラーは次のとおりです。

'ActionView :: Template :: Error(nil:NilClassの未定義のメソッド `each')'

'each'は、以下のユーザーcallback.html.erbビューの<%for i in @positions%>行の@positionにある各iを参照しています。

<% for i in @positions %>
<strong>
<% begin %>
<%= @user.positions.find_by_id(i).title + " at " %>
<% rescue %>
<% end %>

<% begin %>
<%= @user.positions.find_by_id(i).company %>
<% rescue %>
<% end %>
</strong>

これが私の認証コントローラーの関連部分です(コールバックセクション)

def callback

...

    @user = current_user

...

    #positions
    for i in 0..(positions.count-1)

      begin
        @company_i = companies[i]['name']
      rescue
      end

      begin
        @title_i = positions[i]['title']
      rescue
      end

      begin
        @industry_i = companies[i]['industry']
      rescue
      end

      begin
        @start_month_i = positions[i]['start-date']['month']
        @start_year_i = positions[i]['start-date']['year']
      rescue
      end

      begin
        @end_month_i = positions[i]['end-date']['month']
        @end_year_i = positions[i]['end-date']['year']
      rescue
      end

      begin
        @li_pos_id_i = positions[i]['id']
      rescue
      end

      if Position.find_by_li_pos_id(@li_pos_id_i).nil?
        @user.positions.build(li_pos_id: @li_pos_id_i, company: @company_i, title: @title_i, 
          industry: @industry_i, start_month: @start_month_i, start_year: @start_year_i, 
          end_month: @end_month_i, end_year: @end_year_i)
      end
    end

    @user.save
    @positions = @user.positions.map(&:id)
end

.find_byメソッドがnil値を返すことと関係があると思いますが、修正方法がわかりません。ありがとうございました!

編集されたAUTHコントローラー:

positions.each do |position|
      begin
        @li_pos_id = position.id
        @title = position.title
        @company = position.company.name
        @industry = position.company.industry
        @start_month = position.start_date.month
        @start_year = position.start_date.year
        @end_month = position.end_date.month
        @end_year = position.end_date.year
      rescue
      end

      unless Position.find_by_li_pos_id(@li_pos_id)
        current_user.positions.build(li_pos_id: @li_pos_id, title: @title, company: @company, industry: @industry, 
          start_month: @start_month, start_year: @start_year, end_month: @end_month, end_year: @end_year)
      end

      @user.save
      @user.positions.save
    end
4

1 に答える 1

5

ここで行っていることは、すべての例外をキャッチしてゴミ箱に捨てるため、「ポケモン例外処理」と呼ばれます。これは開発するのに非常に悪い習慣であり、他の開発者とチームで作業している場合、予期しないエラーを隠し、デバッグが非常に困難になるため、これらのセクションで適切なスタックトレースを取得できないため、非常に多くのフラストレーションにつながります。壁にぶち当たった。

やみくもに例外をキャッチするのではなく、該当する場合、および発生する可能性のある場合にのみ、特定の予想される例外をキャッチする必要があります。また、そもそもそれらを生成しないようにあらゆる努力を払う必要があります。

この例は次のとおりです。

<% @position_ids.present? and @position_ids.each do |position_id| %>

その種の名前は一般に増分またはインデックス用に予約されているため、位置変数の呼び出しiも非常に貧弱なスタイルです。少し長くてもわかりやすい名前を使用すると、計り知れないほど役立ちます。

また、Rubyがより簡潔なバージョンfor x in yの使用を推奨しているループに対して、この非常に特殊な表記法を使用しています。y.each do |x|

さらに、nil?オブジェクト自体をテストするだけでなく、テストすることはほとんどの場合冗長であり、排除することができます。このテストは、Rubyで真でない値が2つしかないとnil?を区別したい場合にのみ関係します。この場合、単純な方が。よりも優れています。falsenilunless (x)if (x.nil?)

何も取得されない理由について@positionsは、おそらくcallbackルーチンが最初から実行されていないことが原因です。見た目からすると、returnどこかにない限り、その値はルーチンの最後に割り当てる必要があります。

于 2012-08-22T17:56:16.730 に答える