2011-12-19 117 views
1

我使用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

我使用best-in-place宝石来编辑特定的字段。这里是Ryan Bates here的视频。

要查看测试示例检查this

我觉得这是编辑特定字段时不会影响用户体验的最快最简单的方法,而且如果您只是想更新特定字段(如电话和地址),肯定会起作用。希望能帮助到你。

+0

感谢您回应如此到位diligently.Sure最好能使它。但是我想用一个单独的形式有全角度探讨的问题 – 2011-12-19 17:15:54

2

示例代码,从设计,这正好在用户模式:

# 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 
+0

我可以看到方向的方向,但我仍然无法正常工作。当我去滑轨控制台时,地址和电话属性为零 – 2011-12-19 17:34:29

+0

我没有看到你的意思..?地址和电话在params散列?是:current_password给出并在params散列中有效? – clyfe 2011-12-19 17:45:16

+0

不,他们没有。所以params [:user]是不够的? – 2011-12-19 18:11:01

相关问题