Ruby on Rails更新当前用户

时间:2016-01-03 11:24:40

标签: ruby-on-rails ruby ruby-on-rails-4

如何更新当前用户信息,我已尝试但显示此错误:

分配属性时,必须将哈希作为参数传递。

这是我的控制器代码:

 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]+@([^@.\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 %>

请帮助我。

谢谢

3 个答案:

答案 0 :(得分:5)

您无法更新您的用户有两个原因:首先,您的表单会在params嵌套在名为user的键(而不是current_user)下的@user.update_attributes(params[:user]) 中发布数据:

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

其次,在您的模型中,您验证是否存在密码,但您的表单未提供密码。看看documentation of has_secure_password。没有必要进行额外的验证。因此,只需删除该行:

{{1}}

答案 1 :(得分:3)

您需要修改update语句,如下所示:

@user.update_attributes(user_params)

这将更新用户的允许属性。

答案 2 :(得分: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