2009-11-12 31 views
9

ユーザーのプロフィールを更新しようとすると、アプリがランダムに「未定義のメソッド `map for 'nil:NilClass」というエラーを投げているようです。未定義のメソッド 'map' for nil:NilClass

しかし、奇妙なことは、更新時にエラーが発生すると言っていますが、エラー行は実際に表示されています。

全エラー:

{"user"=>{"email_notify"=>"[email protected]", "network_id"=>"", 
"password_confirmation"=>"[FILTERED]", "mobile"=>"", "password"=>"[FILTERED]", 
"email"=>"[email protected]"}, "action"=>"update", "_method"=>"put", "id"=>"5089", 
"controller"=>"users"} 

正直なところでも見て開始する場所がわからない:

users#update (ActionView::TemplateError) "undefined method `map' for nil:NilClass" 

On line #52 of app/views/users/edit.html.erb 

Line 52: <%= options_from_collection_for_select(@networks_domestic, 'id', 'name', @user.network_id) %> 

そしてここでは、最近のエラーからparamsがあります。私はユーザーがFirefoxからではなくIEから同じ情報を更新できると言ってきました。同じ情報を使用すると問題なく更新できます。だから、私は困惑している。

答えて

17

ベストの推測...

あなたの編集機能が正しく@networks_domesticを定義しますが、更新機能にエラーが発生し、render :action => "edit"を呼び出すまで、そのすべてが素晴らしいです。

レンダーは、編集機能を呼び出すのではなく、編集ビューをレンダリングするだけです。したがって、更新が失敗した場合は、@networks_domesticを定義してからupdateから返す必要があります。

したがって、たとえば、あなたは以下を持っている、と言う:

def edit 
    @user = User.find(params[:id]) 
    @networkd_domestic = [...] 
    end 

    def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     flash[:notice] = "User was successfully updated." 
     format.html { redirect_to(admin_users_url) } 
     else 
     format.html { render :action => "edit" } 
     end 
    end 
    end 

@networkd_domesticが更新機能にエラー状態で定義されていないので、あなたが記述されているエラーが発生します。

編集レンダリングの前に@networkd_domestic = [...]を追加してください。

+0

こんにちは@ tony-fontenot、あなたの提案も私のために働いた。ありがとう –

+0

3年後...まだ私に貴重な時間をたくさん保存しました:)。ありがとう – Hugo

+0

これは私が遭遇した問題です。ありがとう! @networkd_domesticを編集と更新の両方ではなく1か所に設定する方法はありますか? – EricC

6

@networks_domenticはコントローラーに正しく設定されていますか? <%= @networks_domestic.inspect %>を52行目の直前に追加し、入手したものを確認してください。コントローラーで@networkd_domestic.nil?を確認し、nilをビューに送信しないようにしてください。

EDIT:

あなたがoptions_from_collection_for_selectのソースを見ればあなたはそれはあなたが合格コレクション(この場合は@networks_domestic)にmapを呼び出していることがわかります。

関連する問題