2016-05-12 3 views
0

Я пытаюсь реализовать Wicked gem с Devise, так как хочу, чтобы пользователи проходили различные шаги, чтобы завершить свои профили. Я полный новичок, поэтому я был бы признателен, если бы вы могли дать мне предложение о том, что может быть проблемой.неопределенный метод `attributes 'для nil: NilClass - Wicked/Devise gems

Ошибка, которую я получаю, эта, и она показывает, когда я пытаюсь перейти от «Личный» к шагу «Стиль». Я предполагаю, что это проблема с сохранением данных:

NoMethodError in OnboardingController#update 

undefined method `attributes' for nil:NilClass 
**@user.attributes(user_params)** 

Это мои регистрационные и адаптационный контроллеры:

class RegistrationsController < Devise::RegistrationsController 


    protected 

    def after_sign_up_path_for(resource) 
    '/onboarding/personal' 
    end 

    def after_update_path_for(resource) 

    registration_steps_path 

    end 

    def new 

    super 

    end 



    def create 

    super 

    end 



    def update 

    super 

    end 



    def update_resource(resource, params) 
    if resource.encrypted_password.blank? # || params[:password].blank? 
     resource.email = params[:email] if params[:email] 
     if !params[:password].blank? && params[:password] == params[:password_confirmation] 
     logger.info "Updating password" 
     resource.password = params[:password] 
     resource.save 
     end 
     if resource.valid? 
     resource.update_without_password(params) 
     end 
    else 
     resource.update_with_password(params) 
    end 
    end 
end 

и

class OnboardingController < ApplicationController 
    include Wicked::Wizard 
    steps :personal, :stylefirst 


    def show 
     @user = current_user 
    render_wizard 

    end 

    def update 

    @user = current_user 

    @user.attributes(user_params) 

    render_wizard @user 

    end 


end 
+0

Ошибка говорит вам, что current_user не существует в действии обновления для контроллера на борту. –

+0

Хм, но он существует, как вы можете видеть ... –

+1

Нет, мы не можем видеть. Может быть, пользователь просто не вошел в систему. – Leito

ответ

1

С Завещания, current_user является nil, если пользователь не является . Таким образом, ваша проблема заключается в том, что вы назначаете @user = current_user на свой update действие без проверки того, что пользователь выполнил вход.

Если вы хотите, чтобы обеспечить update действие доступно только зарегистрированным пользователям, а затем использовать authenticate_user! вспомогательный действие предоставленный Devise:

class OnboardingController < ApplicationController 
    before_filter :authenticate_user!, only: [:edit, :update] 

    # ... 
end 

Метод authenticate_user! помощник будет перенаправлять пользователя на страницу входа в если они не вошли в систему. Если пользователь успешно выполнит вход, будет установлено значение current_user, и они будут перенаправлены обратно на страницу, с которой первоначально пытались получить доступ.

+0

Это было из-за аутентификации, спасибо! Но теперь я получаю новую ошибку в той же строке: ActiveModel :: ForbiddenAttributesError –

+0

Вам нужно сделать белый список параметров, которые вы передаете из своей формы, используя сильные параметры: http://edgeguides.rubyonrails.org/action_controller_overview.html # сильные-параметры. –

+0

большое спасибо Энтони! работает! :) –