2009-11-12 6 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입니다. 나는 사용자가 IE에서 같은 정보를 업데이트 할 수 있다고 말했지만 파이어 폭스에서는 그렇지 못했다. 그리고 같은 정보를 사용하면 문제없이 업데이트 할 수 있습니다. 그래서 나는 곤두박질 친다.

답변

17

추측 ...

귀하의 편집 기능이 제대로 업데이트 기능에서 오류가 발생하고 render :action => "edit"를 호출 할 때까지 @networks_domestic 그래서 모든 것이 훌륭 정의합니다.

렌더는 편집 기능을 호출하지 않고 편집보기를 렌더링합니다. 따라서 업데이트가 실패한 경우 업데이트에서 돌아 오기 전에 @networks_domestic을 정의해야합니다.

그래서 예를 들어, 다음과 같은이 말 : 당신은 당신이 @networkd_domestic 때문에 설명하는 오류가 업데이트 기능에서 오류 조건에 정의되지 않은 얻을 것이다
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 = [...]을 추가하면 좋을 것입니다.

+0

안녕하세요. @ tony-fontenot, 귀하의 제안은 나를 위해 일했습니다. 감사합니다 –

+0

3 년 후 ... 아직도 나를 귀중한 시간을 많이 구해주었습니다 :). 감사합니다 – Hugo

+0

이것은 제가 겪은 문제입니다. 감사! @networkd_domestic을 편집 및 업데이트 대신 한 곳에서 설정할 수있는 방법이 있습니까? – EricC

6

@networks_domentic이 컨트롤러에 올바르게 설정되어 있습니까? 라인 52 바로 앞에 <%= @networks_domestic.inspect %>을 추가하고 얻은 것을 확인하십시오. 제어기에서 @networkd_domestic.nil?을 점검하고 nil을보기에 보내지 않았는지 확인하십시오.

편집 :

당신이 options_from_collection_for_select의 소스를 보면 당신이 (이 경우 @networks_domestic) 당신이 통과 컬렉션 map를 호출하는 것을 볼 수 있습니다.

관련 문제