Как обновить пользователя без изменения его учетных данных - PullRequest
1 голос
/ 19 декабря 2011

Я использую Волшебный камень для управления аутентификацией.Вы можете увидеть код ниже.

models / 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 

controllers / 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 ]

2 голосов
/ 19 декабря 2011

Пример кода от 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
2 голосов
/ 19 декабря 2011

Я использую драгоценный камень best-in-place для редактирования определенных полей.Вот видео-ролик Райана Бейтса здесь .

Чтобы увидеть тестовый пример, проверьте this .

Я считаю, что это самый быстрый иСамый простой способ редактировать определенные поля, не мешая работе с пользователем, и определенно сработает, если вы просто захотите обновить определенные поля, такие как телефон и адрес.Надеюсь, это поможет.

...