2013-12-17 14 views
7

Używałem strong_params i próbuję utworzyć obiekt do przekazania. Mam dwa pytania.Wspaniały ActiveModel :: ForbiddenAttributesError

  1. Jak sprawdzić, który atrybut powoduje problem?
  2. Czego mi brakuje w poniższym kodzie?

Zacznijmy od błędu, dziennik nic mi nie mówi.

ActiveModel::ForbiddenAttributesError in JobsController#create 

Tylko dla chichotów, tutaj jest dziennik, który nie widzę bardzo przydatne:

Started POST "/jobs" for 127.0.0.1 at 2013-12-17 22:03:59 +0000 
Processing by JobsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ohq4lVqPVMpjzbZwCfJNYBL78TAcoC0WZLSmpCzMD3k=", "job"=>{"job_title"=>"Junior Rails Developer", "job_description"=>"A new position getig nsomethfins lansnana", "languages"=>["", "Rails", "Ruby"], "country_code"=>"AO", "job_type"=>"Full-Time", "job_salary"=>"30000", "job_level"=>"Junior"}, "commit"=>"Create Job"} 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 
Completed 500 Internal Server Error in 8ms 

ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError): 

ma sens, ale wtedy, gdy patrzę na mój utworzyć:

def create 
    binding.pry 
    @job = Job.new(job_params) 

    respond_to do |format| 
     if @job.save 
     format.html { redirect_to @job, notice: 'Job was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @job } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Strong_params:

def job_params 
     params.require(:job).permit(:job_title, :job_level, :job_description, :job_salary, 
            :country_code, :job_type, :state, :languages => []) 
    end 

Jestem zainteresowany głównie w znalezieniu sposobu, aby dowiedzieć się, gdzie jest problem dla przyszłości, ponieważ wydaje się, jak błąd igły w stogu siana.

+0

Czy uruchomiłeś ponownie swój lokalny serwer? – ChrisBarthol

+1

Hah, tylko sprawdzam. Przeglądanie go w językach jest wyświetlane jako log w dzienniku. Spróbuj zmienić: języki na języki: [] lub: languages ​​=> [], aby zachować tę samą składnię z kodem – ChrisBarthol

+0

Czy masz attr_accessible zdefiniowane w modelu dla wszystkich atrybutów, na które zezwalasz? – usha

Odpowiedz

2

W pliku dziennika pokazuje parametry aplikacja staje się od stworzenia:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ohq4lVqPVMpjzbZwCfJNYBL78TAcoC0WZLSmpCzMD3k=", "job"=>{"job_title"=>"Junior Rails Developer", "job_description"=>"A new position getig nsomethfins lansnana", "languages"=>["", "Rails", "Ruby"], "country_code"=>"AO", "job_type"=>"Full-Time", "job_salary"=>"30000", "job_level"=>"Junior"}, "commit"=>"Create Job"} 

trzeba najpierw upewnić się, każdy parametr jest wymieniony w definicji silnego params. Następnie upewnij się, że każdy parametr jest prawidłowy.

:parameter   #accepts a single entry 
:parameter => [] #accepts a hash 
:paramters_attributes: [:firstattribute, :secondattribute] #accepts nested parameters 

Parametry twojego języka są wyświetlane w dzienniku jako hash, ale masz tylko: języki w dozwolonych parametrach. Zmiana parametru w celu zaakceptowania hasza powinna rozwiązać problem.

:languages => [] 

Również w tym blogu jest pomocna pokazując silne parametry, np http://blog.sensible.io/2013/08/17/strong-parameters-by-example.html

+0

Serwer ponownie próbował użyć dozwolonych wartości skalarnych, ale nadal otrzymuję ten sam błąd, jest to jedyny błąd, który generalnie napotkałem w Railsach, który nie daje niesamowitych informacji zwrotnych. Jakikolwiek pomysł, jak inaczej mogę znaleźć błąd. –

+0

Używasz Rails 4 poprawnie? – ChrisBarthol

+0

Tak, używam szyn 4 –

0

Ten błąd jest podniesiona podczas próby masowej przypisać skrót parametru, który zawiera klucze niedozwolona. Twoja metoda job_params zwraca hash zawierający tylko klucz/wartości określone w wywołaniu permit, więc wszystko powinno być w porządku ...

Czy jesteś pewien, że błąd wystąpił w opublikowanym fragmencie kodu? Jedyną możliwą lokalizacją będzie linia @job = Job.new(job_params), czy ta linia jest wymieniona w śledzeniu wstecznym? Jeśli nie, czy mógłbyś opublikować pełny ślad śledzenia wstecznego? Ponieważ błąd musi się zdarzyć w filtrze lub obserwatorze lub coś podobnego ...

1

Prawdopodobnie nie ma to zastosowania w tym przypadku, ale miałem problem z Rails 4, ale tylko z działaniem create. Przeglądanie pełnego śledzenia stosu w dzienniku programistycznym zawierało kilka odwołań do CanCan i modelu umiejętności, którego używałem do kontroli dostępu.

Zacząłem pomocą load_and_authorize_resource jak zaleca się w górnej części kontrolera, ale kiedy usunięto go i po prostu permissioned każdą akcję „długa ręka”, problem z parametrami zniknął.

Powiązane problemy