2013-02-24 102 views
1

我想要的:用戶登錄到他的帳戶,並自動更新自己的計數器(@counter + = 1)。創建一個計數方法用戶登錄與Ruby on Rails

我是Ruby和Rails的新手,我使用的是Rails 3.2.12。我讀了「雄辯的紅寶石」一書,在這個問題上搜索了stackoverflow,並從pragmaticstudio.com上觀看了一段視頻 - 紅寶石課程。在視頻過程中,他們創造了這樣一個類:

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation, :counter 
    has_secure_password 
    before_save { |user| user.email = email.downcase } 
    before_save :create_remember_token 

    def initialize(counter=0) 
    @counter = counter 
    end 

    def w00t 
    @counter += 15 
    end 

    private 
    def create_remember_token 
     self.remember_token = SecureRandom.urlsafe_base64 
    end 
end 

現在,在我的應用程序在用戶登錄結算與SessionsController和來到這裏,我的問題,因爲從用戶模型中的每個方法是「未知」,以SessionsController。

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.find_by_email(params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_back_or templates_path 
    else 
     flash.now[:error] = 'something went wrong.' 
     render 'new' 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

以下是我已經嘗試過,但對於我的解決方案沒有奏效:我在SessionsController添加

user.w00t 

,1線以上

sign_in user 

返回的錯誤是: 「SessionsController的undefined methode'w00t'」。

我也試着寫在會議助手的方法:

def woot(template) 
    template.counter += 1  
end 

然後我重新命令我SessionsController「create」方法,像這樣:

def create 
    template = Template.find_by_bosskey(params[:bession][:bosskey]) 
    if template 
     woot template     #that is my new line ! 
     tsign_in template 
     redirect_back_or template 
    else 
     flash.now[:error] = 'something went wrong.' 
     render 'new' 
    end 
    end 

有了這個,我沒有得到任何錯誤,但仍然計數器不會改變。那時我更困惑。請告訴我在哪裏放置該方法或如何解決我的應用程序丟失的問題。

回答

3

您的計數器未被增加,因爲它沒有被保存到數據庫中。您使用僅對當前請求有效的實例變量。只要重定向並重新加載頁面,該對象就會丟到垃圾回收器以及計數器。

爲了讓計數器保持不變,您需要在用戶上創建一個新列來保存計數器,然後您可以使用Rails提供的增量方法。

# create the migration 

rails g migration add_sign_in_count_to_users sign_in_count:integer 
rake db:migrate 

# Then increment 

class User < ActiveRecord::Base 
    def w00t 
    increment! :sign_in_count 
    end 
end 

ActiveRecord::Persistence#increment!

+0

你應該教課!非常感謝你的回答。 – rubybrah 2013-02-24 05:42:36