2015-02-11 3 views
2

Я недавно работал над обновлением учетной записи пользователя с помощью Devise, что я пытаюсь сделать, это разрешить параметры, необходимые для обновления. Я сделал это раньше для sign_up разрешив параметры следующим образом:Уровень стека слишком глубокий с помощью Devise

#application_controller.rb 
def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) << :nombre << :apellido 
    end 

Теперь, который работает как шарм, когда пользователь подписывает, и я думал, что я мог бы сделать то же самое, чтобы изменить информацию о пользователе, так что я сделал следующее:

#application_controller.rb 
def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:edit) << :genero << :estatura << :ciudad_id << :foto << :nombre << :apellido 
    end 

Удивительно, но это не сработало, и я не знаю почему. Я сделал то же самое, что и раньше, и ничего не произошло. Итак, я начал искать различные способы редактирования информации пользователя, сделал то, что palaformatec recommends to do и даже рассмотрел различные вопросы здесь, но я не смог найти ответ.

Мой registrations_controller.rb выглядит следующим образом:

#registrations_controller.rb 
    class RegistrationsController < Devise::RegistrationsController 

def update 

    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key) 
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email) 
    resource_updated = update_resource(resource,account_update_params) 
    yield resource if block_given? 
    if resource_updated 
     if is_flashing_format? 
      flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ? 
      :update_needs_confirmation : :updated 
      set_flash_message :notice, flash_key 
     end 
     sign_in resource_name, resource, bypass: true 
     respond_with resource, location: after_update_path_for(resource) 
    else 
     clean_up_passwords resource 
     respond_with resource 
    end 
end 

protected 

    def params 
     params.require(:user).permit({:fecha_nacimiento=>[]},:nombre,:apellido,:ciudad_id,:foto,:genero,:estatura) 
    end 

    def account_update_params 
     devise_parameter_sanitizer.for(:account_update) << {:fecha_nacimiento => []} << :genero << :estatura << :ciudad_id << :foto << :nombre << :apellido 
    end 
    def update_resource(resource,params) 
     resource.update_without_password(params) 
    end 

end 

Я действительно не знаю, что еще сделать, я тоже попросил друзей, и никто не знает, что происходит. Я знаю, что уровень стека слишком глубок, когда присутствует бесконечный цикл, но ни мне, ни моим друзьям не удалось определить, что вызывает его.

Если вам нужна дополнительная информация, я отредактирую вопрос и добавлю его для вас.

Благодарим вас заблаговременно.

ответ

2

Этот бит кода является один вызывая Stack level too deep error:

def params 
    params.require(:user).permit({:fecha_nacimiento=>[]},:nombre,:apellido,:ciudad_id,:foto,:genero,:estatura) 
end 

Пока вы используете имя метода внутри самого метода, вы делаете ваш метод не называть себя рекурсивно до тех пор ... бум! Переименуйте название метода:

def update_params 
    params.require(:user).permit({:fecha_nacimiento=>[]},:nombre,:apellido,:ciudad_id,:foto,:genero,:estatura) 
end 

и все должно быть в порядке.

+1

Я не могу поверить, что это было так легко исправить ... Большое спасибо, я боролся с этим в течение нескольких дней, вы спасли мне жизнь: D –

+0

Рад помочь :) – dgilperez