2012-01-09 19 views
4

私のアプリケーションには2つのクラスのアカウントがあります。私はそれらの1人(投資家)の属性を更新しようとしています。それらはdeviseを介して1つのフォームを使用して作成されます。結果として、投資家が自分のアカウント情報を更新しようとすると、フォームはパスワードを提供して確認する必要があります。これらのフィールドでパスワードを変更しない限り、パスワードを入力せずに(姓、名字など)編集できるようにしたいと思います。ここでRuby on Railsを更新すると、パスワードなしでユーザの属性が変更されます

は、投資家コントローラ

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 

はここ

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

私のroutes.rbをだであり、これはの部分でありますアカウントモデルの属性を参照する私の投資家モデル。ここで

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をあなたのparamsのどこにでも送っていますか? (空白の場合でも?)通常、パスワードを要求するときには#update_with_passwordを使用したいと思っています。だから、なぜこれを取得しているのかわからない:update_attributes。

+0

私は、update_with_passwordメソッドを含むdeviseファイルの場所を知りません。私はそれを見つけることができるか分かりますか? – seanpat09

+0

bundleler/textmateを使用している場合は、コマンドラインから "mate $(bundle show devise)"を使用して宝石のソースを編集できます。それ以外の場合は$ GEM_HOMEパスになければなりません。宝石のソースでは、次の方法でメソッドを見ることができます:lib/devise/models/database_authenticatable.rb 更新中にパスワードを要求する必要がある場合にのみ、この方法を使います。誤ってparams [:current_password]を渡していないかどうかを確認してみてください – RobH

+0

これまでにありがとうございました。私は実際にパスワードを必要とせずに更新したい。私のフォームには、passwordやpassword_confirmationなど、更新可能なすべてのフィールドがあります。私は、パスワードとパスワードの確認のためにフィールドに何も置かなくても残りの情報を更新できるようにしたい。私がそれをすると、空ではないというエラーメッセージが表示されます。また、:current_passwordはプロジェクトファイルのどこにも定義されていませんが、devise gem sourceに定義されています。あなたが言っていたものですか? – seanpat09

関連する問題