2016-01-03 5 views
0

Как я могу обновить текущую информацию о пользователе, я пытался, но показывает эту ошибку:Рубин на Rails обновление текущего пользователя

When assigning attributes, you must pass a hash as an argument.

Это мой код контроллера:

def edit 
    @user = current_user 
    end 

def update 
    @user= current_user 
    if @user.update_attributes(params[:current_user]) 
    # Handle a successful update. 
    else 
    render 'edit' 
    end 
end 

Мои маршруты:

get 'edit' => 'users#edit' 
post 'edit' => 'users#update' 

Params:

private 

def user_params 
    params.require(:users).permit(:first_name, :last_name, :email) 
end 

Моя модель:

class User < ActiveRecord::Base 
before_save { email.downcase! } 

validates :first_name, :presence => true, :length => { :in => 3..20 } 
validates :last_name, :presence => true, :length => { :in => 3..20 } 
validates :email, :presence => true, :uniqueness => true, format: { with: /\A[^@\s][email protected]([^@.\s]+\.)+[^@.\s]+\z/ } 

has_secure_password 
validates :password, presence: true, length: { minimum: 6 } 
end 

Форма:

<%= form_for :user, url: my_account_path(@user), action: :update, method: :post do |f| %> 
    <%= f.text_field :first_name %> 
    <%= f.text_field :last_name %> 
    <%= f.text_field :email %> 
    <%= f.submit "Update Account" %> 
<% end %> 

Это помогло бы мне много, пожалуйста.

Благодаря

+1

Опубликовать свое значение «params» – RAJ

+0

Hi @RAJ, Сообщение обновлено –

+0

Спасибо, посмотрите на решение: http://stackoverflow.com/a/34576231/1047207 – RAJ

ответ

3

Вы должны изменить свой update заявление выглядеть следующим образом:

@user.update_attributes(user_params) 

Это будет обновить разрешенные атрибуты пользователя.

5

Вы не можете обновить пользователя по двум причинам: во-первых, ваши формы сообщений данные в params вложенным под ключ с именем user (вместо current_user):

@user.update_attributes(params[:user]) 

Второму , в вашей модели вы подтверждаете наличие пароля, но ваша форма не предоставляет пароль. Посмотрите на documentation of has_secure_password. Нет необходимости в дополнительной проверке. Поэтому просто удалить строку:

validates :password, presence: true, length: { minimum: 6 } 
+1

Кроме того, прочитайте, используя [сильные параметры] (http://weblog.rubyonrails.org/2012/3/21/strong-parameters/) - особенно для чего-то чувствительного, как детали пользователя. – mikej

+0

Hi @spickermann Спасибо, но решение не работает. такая же проблема –

+0

@ShabbirAhmed: Я обновил свой ответ. – spickermann

2

Правильный путь будет использовать следующее:

#config/routes.rb 
resource :user, path: "", only: [:edit, :update] #-> url.com/edit 

#app/controllers/users_controller.rb 
class UsersController < ApplicationController 
    def edit 
     @user = current_user #-> you don't really need this 
    end 

    def update 
     if current_user.update user_params 
     # do something 
     else 
     render :edit 
     end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:x, :y, :z) 
    end 
end 
+0

Hi @ich Peck Спасибо, но атрибут не сохраняется –

+0

. Можете ли вы опубликовать свои параметры, форму и модель пользователя? –

Смежные вопросы