2013-02-24 74 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