如何在不更改其凭据的情况下更新用户

时间:2011-12-19 17:00:12

标签: ruby-on-rails sorcery

我使用sorcery gem来管理身份验证。你可以看到下面的代码。

模型/ user.rb

class User < ActiveRecord::Base
  authenticates_with_sorcery! 

  attr_accessible :username, :email, :password, :password_confirmation

  has_many :clients
  has_many :orders

  validates_presence_of :email, :username, :on => :create
  validates_presence_of :password, :on => :create
  validates_uniqueness_of :email
  validates_confirmation_of :password, :message => "confirmation doesn't match password " 
  validates_length_of :password, :minimum => 6
end 

控制器/ users_controller.rb

 class UsersController < ApplicationController
    before_filter :require_login, :except => [:not_authenticated, :new, :create]
    skip_authorize_resource :only => [:new, :create]

    layout "users"

  def new
      @user = User.new
    end

    def create
      @user = User.new(params[:user])
      if @user.save
        redirect_to clients_url, :notice => "Bienvenu dans la communauté Bakden!!!"
      else
        render :new
      end
    end


 #show user profile
  def show
        @user = User.find(session[:user_id])

            respond_to do |format|
          format.html # show.html.erb
          format.json { render json: @user }
        end
      end

# edit user profile
  def edit
    @user = User.find(session[:user_id])  
  end

# update user profile

  def update
    @user = User.find(session[:user_id])

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
        format.json  { head :ok }
      else
        format.html { render :action => "edit" }
        format.json { render json: @user.errors, :status => :unprocessable_entity }
      end
    end
  end

_form.html.erb

<%= simple_form_for (@user),:html => {:multipart => true} do |f| %>

  <div class="inputs">
    <%= f.input :adress %>
    <%= f.input :city %>
    <%= f.input :country ,:as => :country %>
    <%= f.input :telephone, :as => :string %>
    <%= f.file_field :picture %>     

  <div class="actions">
    <%= f.button :submit %> | <%= link_to "cancel", profile_path%>
  </div>
<% end %> 

如何编辑地址,电话等用户信息,而不会影响作为凭据的密码,电子邮件和用户名。

2 个答案:

答案 0 :(得分:2)

我使用best-in-place gem来编辑特定字段。以下是Ryan Bates here的视频啧啧。

要查看测试示例,请检查this

我发现这是在不妨碍用户体验的情况下编辑特定字段的最快速最简单的方法,如果您只想更新电话和地址等特定字段,肯定会有效。希望它有所帮助。

答案 1 :(得分:2)

示例代码,来自Devise,这适用于您的用户模型:

  # Update record attributes when :current_password matches, otherwise returns
  # error on :current_password. It also automatically rejects :password and
  # :password_confirmation if they are blank.
  def update_with_password(params, *options)
    current_password = params.delete(:current_password)

    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    result = if valid_password?(current_password)
      update_attributes(params, *options)
    else
      self.attributes = params
      self.valid?
      self.errors.add(:current_password, current_password.blank? ? :blank : :invalid)
      false
    end

    clean_up_passwords
    result
  end

  # Set password and password confirmation to nil
  def clean_up_passwords
    self.password = self.password_confirmation = nil
  end