1

我想要什么:用户登录他的帐户并自动更新他自己的计数器(@counter += 1)。

我是 Ruby 和 Rails 的新手,我正在使用 Rails 3.2.12。我阅读了《雄辩的 ruby​​》一书,搜索了有关此问题的 stackoverflow,并观看了 pragmaticstudio.com 的视频 ruby​​ 课程。在那个视频课程中,他们创建了一个这样的类:

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 解决的,我的问题来了,因为来自 User 模型的每个方法对于 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

这是我已经尝试过但不适用于我的解决方案的方法:我添加了

user.w00t

在 SessionsController 中,上面的 1 行

sign_in user

返回的错误是:“SessionsController 的未定义方法‘w00t’”。

我还尝试在 Sessions Helper 中编写一个方法:

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

有了这个我没有得到任何错误,但计数器仍然没有改变。我比以往任何时候都更加困惑。请告诉我在哪里放置该方法或如何为我的应用解决此问题,我迷路了。

4

1 回答 1

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!

于 2013-02-24T03:17:14.467 回答