2012-01-09 6 views
4

У меня есть два класса учетных записей в моем приложении. Я пытаюсь обновить атрибуты одного из них (Инвесторы). Они создаются с использованием одной формы через устройство. В результате, когда инвестор пытается обновить свою учетную информацию, форма требует, чтобы они предоставили и подтвердили свой пароль. Я бы хотел, чтобы они могли редактировать (имя, фамилию и т. Д.) Без ввода пароля, если они не хотят менять свой пароль с этими полями.Обновление Ruby on Rails при разработке атрибутов пользователя без пароля

Вот мой метод обновления в контроллере Investor

def update 

    session[:investor_params] ||= {} 
    session[:investor_params].deep_merge!(params[:investor]) if params[:investor].present? 

    @investor.attributes = session[:investor_params] 

    params[:investor_params].delete(:password) if params[:investor_params][:password].blank? 
    params[:investor_params].delete(:password_confirmation) if params[:investor_params][:password_confirmation].blank? 
    respond_to do |format| 
    if @investor.update_attributes(params[:investor_params]) 
     session[:investor_params] = nil 
     sign_in(@investor.account, :bypass => true) 
     format.html { redirect_to(projects_url, :notice => 'Investor was successfully updated.') } 
     format.xml { render :xml => @investor, :status => :created, :location => @investor } 

    else 
     format.html { render :action => "edit", :layout => "investor" } 
     format.xml { render :xml => @investor.errors, :status => :unprocessable_entity } 
    end 
    end 
    end 

Вот моя регистрация контроллер

class RegistrationsController < Devise::RegistrationsController 

    layout "index" 

    protected 

    def after_sign_up_path_for(resource) 
    new_user_url(:account => resource) 
    end 
end 

Вот мой routes.rb

devise_for :accounts, :controllers => { 
    :registrations => 'registrations', 
    :passwords  => 'passwords', 
    :sessions  => 'sessions' } 
    devise_scope :account do 
    root :to => 'registrations#new' 

И это часть моя модель инвестора, которая ссылается на атрибуты для модели учетной записи.

class Investor < ActiveRecord::Base 

    has_one :account, :as => :profile 

    accepts_nested_attributes_for :account 

Вот часть модели счета, на который ссылается

class Account < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :invited_by, :invited_by_id 

Я попытался рекомендации по Разрабатывают GitHub репо, но я не смог заставить его работать для меня.

Если у вас есть предложения или если у меня что-то отсутствует, сообщите мне!

ответ

3

Вы отправляете: current_password где угодно в своих параметрах? (даже если он пуст?) Обычно для разработки требуется, чтобы вы использовали #update_with_password, когда вам нужен пароль, поэтому я не уверен, почему вы получаете это с помощью: update_attributes.

+0

Я не знаю, где находится файл разработки, содержащий метод update_with_password; devise установлен как драгоценный камень, хотя, знаете ли вы, где я могу его найти? – seanpat09

+0

Если вы используете bundler/textmate, вы можете использовать «mate $ (bundle show devize)» из командной строки, чтобы отредактировать источник драгоценного камня. В противном случае это должно быть в пути $ GEM_HOME. В источнике драгоценных камней вы можете просмотреть этот метод в: lib/devise/models/database_authenticatable.rb Вы хотите использовать этот метод только в том случае, если вы _want_ потребуете пароль при обновлении. Попробуйте проверить, случайно ли вы проходите в params [: current_password] – RobH

+0

Спасибо, что помогли до сих пор, я немного новичок в этом. Я действительно хочу обновить, не требуя пароля. В моей форме есть все поля, которые могут быть обновлены, включая пароль и пароль_подтверждение. Я хочу иметь возможность обновлять остальную информацию, не помещая ничего в полях для пароля и пароля_подтверждения. Когда я это сделаю, я получаю сообщение об ошибке, говорящее, что они не могут быть пустыми. Кроме того: current_password не определен нигде в наших файлах проекта, но он определен в devem gem source; это то, о чем вы говорили? – seanpat09

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